Read this first if you're new — these terms are used throughout the guide.
Term
Definition
Task
The core entity — a timer with attached actions and configuration
Watchdog / Dead Man's Switch (DMS)
A task type that fires if you don't check in (postpone) before the deadline
Reminder
A task type that fires at a scheduled time, with optional recurrence (Alarm, Pomodoro, Spaced Repetition)
Challenge
A public task type that other users can join and compete in
Personal Report
A private task type shared between two users
Subtask
An action (Email, SMS, Telegram, API, Publish, SSH commands) attached to a Watchdog task
Action Chain
A sequence of subtasks with defined execution order
Postpone
Extending a task's deadline by the configured time period
Forced Start
Full-screen countdown page that appears when a Watchdog reaches its deadline
Tier
Your subscription level, which determines resource limits
Search Tag
Your unique identifier for contacts (format: Name#12345)
WATCHER
A sharing role with read-only access to a task
ASSIGNEE
A sharing role with write access to a task's status and comments
Feed
Public page showing challenge invites and publications
PWA
Progressive Web App — installable version with offline support
Service Worker
Background process that handles notifications and offline functionality
Session / Device
One signed-in device. DMH tracks each device separately, so logging in on a new device doesn't sign you out elsewhere; manage them in Settings → Active sessions
1. Introduction
What is DMH?
Dead Man's Hand (DMH) is a watchdog timer and smart reminder platform. At its core, DMH lets you set up timers that trigger automated actions — sending emails, SMS messages, Telegram notifications, or API calls — unless you actively postpone them. Think of it as a "dead man's switch" for the digital age, combined with a full-featured reminder and productivity system.
DMH also includes social features: contacts, task sharing, public challenges with leaderboards, a community feed, and real-time chat.
Who is it for?
Anyone who needs reliable scheduled reminders with multiple notification channels.
Security-conscious users who want failsafe delivery of sensitive information if they become unavailable.
Productivity enthusiasts who use Pomodoro or spaced repetition techniques.
Teams and communities who want to create public challenges or share accountability tasks.
What problems does it solve?
Problem
DMH Solution
"I need to send an email/document if I stop checking in"
Watchdog timer with email/SMS/Telegram subtasks
"I need recurring alarms on specific days"
Alarm mode with Daily/Monthly/Yearly repeat and weekday filtering
"I want Pomodoro work/break cycles"
Built-in Pomodoro with configurable durations and working hours
"I'm studying and need spaced repetition"
Spaced Repetition mode with multi-day or intra-day intervals
"I want to challenge friends to complete tasks"
Public Challenge type with leaderboard
"I need to assign a task to someone and track it"
Personal Report with ASSIGNEE/WATCHER sharing
What DMH does NOT do
DMH is not a to-do list or project management tool. It does not have Kanban boards, subtask dependencies between different tasks, or Gantt charts.
DMH does not guarantee delivery timing to the second. Server-side scheduling runs every minute. A task set for 14:05:30 will fire between 14:05:00 and 14:06:00.
DMH does not store or manage files long-term. File attachments on watchdog emails are sent on trigger and not retained after delivery.
DMH does not provide end-to-end encryption for chat. Messages are stored server-side and moderated.
SMS and Telegram subtask delivery depends on third-party service availability. DMH retries up to 3 times but cannot guarantee delivery if the external service is down.
2. Quick Start
Goal: Create your first watchdog timer and see it in action.
Time required: ~3 minutes.
Before you start — install DMH as an app (recommended). DMH is a Progressive Web App, so you can install it like a native app on your phoneor your computer for reliable background notifications and offline reminders:
On your phone: open DMH in your browser and choose "Add to Home Screen" (Safari: Share → Add to Home Screen; Chrome / Android: ⋮ menu → Install app).
On your computer: in Chrome or Edge, click the install icon in the address bar, or ⋮ menu → Install DMH….
Installing is optional — DMH also runs straight in the browser — but it is the most reliable way to get background notifications and to use the app offline. See §5.20 PWA & Offline Mode.
Sign up — Go to the homepage and click "Get Started", or sign in with GitHub / Google.
Verify your email (optional but recommended) — Check your inbox and click the verification link. Some features (chat, sharing) require this.
Create a task — On the Dashboard, click "New Task". Select "Watchdog Timer".
Fill in the basics:
Title — e.g., "Daily check-in"
Description — e.g., "I missed my check-in" (used as the push-notification payload, not the email body)
Postpone Period — select "Day" (24 hours)
Start At — pick a time at least firstWarning + 1 minutes from now (6 minutes by default, configurable in Settings → Watchdog Warning Periods)
Add a subtask — Click "Add Subtask" → choose "Email" → enter a recipient email, subject and content. (The email body lives in the subtask, not the task's Description field.)
Activate — Click "Create", then click "Run" on the new task card.
Postpone — Before the timer runs out, click the postpone button on the task card to push the deadline forward.
Result: You now have a running watchdog. If you stop postponing, the email will be sent automatically when the timer expires.
3. Key Concepts (Mental Model)
Tasks
A task is the core entity in DMH. Every task has:
A type (Watchdog, Reminder, Challenge, or Personal Report)
A status (Inactive, Active, InProgress, Completed, or Failed)
A start time (when the timer fires)
A postpone period (how much time each postpone adds)
Optional subtasks (actions that execute when the task triggers)
Optional sharing (other users who can view or act on the task)
Task Lifecycle (Statuses)
Every task moves through statuses in a specific order:
┌──────────┐
│ Inactive │ ← Created here. Also returns here on Deactivate/Reopen.
│ (0) │
└────┬─────┘
│ User clicks "Run"
▼
┌──────────┐
│ Active │ ← Timer is counting down. Postpone resets the clock.
│ (1) │
└────┬─────┘
│ Timer reaches 0
▼
┌────────────┐ ┌───────────┐
│ InProgress │────►│ Completed │ (success)
│ (2) │ │ (3) │
└─────┬──────┘ └───────────┘
│
│ 3 retries exhausted
▼
┌──────────┐
│ Failed │ (error message shown)
│ (5) │
└──────────┘
Key transitions you can trigger:
Run — Inactive → Active
Deactivate — Active → Inactive, or Failed → Inactive
Reopen — Completed → Inactive
Postpone — Active stays Active, timer extended
Automatic transitions:
Active → InProgress — when the timer expires
InProgress → Completed — after successful execution
InProgress → Failed — after 3 failed retry attempts
InProgress → Failed — stuck-task recovery (>5 minutes with no progress)
InProgress → Active — for recurring tasks (alarm, pomodoro, spaced rep) that reschedule
Task Types
Type
Purpose
Fires When
Repeats?
Watchdog
Dead man's switch — automated actions if you stop checking in
Timer reaches 0 and you don't postpone
No (one-shot)
Reminder — Alarm
Classic alarm with optional recurrence
Scheduled time arrives
Optional: Daily, Monthly, Yearly
Reminder — Pomodoro
Work/break productivity cycles
Each cycle ends
Yes (infinite until stopped)
Reminder — Spaced Repetition
Memory training with expanding intervals
Next interval arrives
Yes (until all intervals complete)
Challenge
Public competition with participants
Published to feed immediately
No
Personal Report
Private shared ticket for collaboration
Shared immediately when created
No
Subtasks (Action Chains)
Subtasks are actions attached to a Watchdog task that execute when the timer fires. You can chain multiple subtasks together.
You ──search tag──► Find User ──send request──► Pending
│
They accept│
▼
Accepted ──► Share tasks
──► Chat
──► Challenges
Contacts are mutual: both sides must agree. Once connected, you can share tasks, chat, and collaborate.
Tiers & Limits
DMH uses a freemium model. Free users can create up to 3 active watchdog tasks and have 1 contact. Paid tiers unlock more capacity.
4. Scenarios
Each scenario follows this template: When to use → Preconditions → Steps → Expected result → Possible problems.
4.1 Setting Up a Dead Man's Switch
When to use: You want an email (or other action) to be sent automatically if you stop checking in regularly.
Preconditions: Logged in. Email verified (for email subtasks).
Steps:
Dashboard → "New Task" → select "Watchdog Timer".
Enter a Title (e.g., "Emergency contact alert").
Enter a Description — used as the push-notification payload when the task starts. (The email body lives in the EMAIL subtask configured in step 6, not here.)
Set Postpone Period to how often you plan to check in (e.g., "Day").
Set Start At to at least firstWarning + 1 minutes from now (6 minutes by default; raise the warning period in Settings → Watchdog Warning Periods and the floor rises with it). Both the native input's min attribute and the React validator now share this same source of truth.
Click "Add Subtask" → "Email":
Enter recipient email, subject, content.
Optionally attach a file (.zip, .rar, .7z, .tar, .gz).
(Optional) Add more subtasks: SMS, Telegram, API Trigger, SSH command, or Home Assistant.
Click "Create".
On the task card, click "Run" to activate.
Postpone daily to prevent the timer from firing.
Expected result: The timer counts down on the Dashboard. Each time you click the postpone button, the deadline extends by your configured period. If you miss the deadline, all subtasks execute in order.
Possible problems:
Problem
Cause
Solution
"Create" button disabled
Required fields missing (title, description, start time, or at least one valid subtask)
Fill in all required fields and add at least one fully-configured subtask
"Tier limit reached" modal
Free tier allows max 3 active watchdog tasks
Deactivate or delete an existing task, or upgrade tier
Start time rejected
Form requires firstWarning + 1 minutes lead time (6 min by default; rises if you raised the "first warning" period in Settings)
Pick a later time, or shorten Settings → Watchdog Warning Periods
4.2 Creating a Daily Alarm
When to use: You want a recurring notification at the same time every day (or on specific days of the week).
Preconditions: Logged in.
Steps:
Dashboard → "New Task" → "Reminder".
Mode: Alarm.
Repeat: Daily.
Select which weekdays the alarm should fire (default: all 7 days). Click days to toggle.
Set Start At to the desired time (e.g., 08:00 tomorrow).
Toggle Sound on/off.
Click "Create", then "Run".
Expected result: A notification fires at the configured time each selected day. After each notification, the task automatically reschedules to the next matching weekday.
Variations:
Monthly alarm: Set Repeat to "Monthly" — fires on the same day each month.
Yearly alarm: Set Repeat to "Yearly" — fires on the same date each year.
One-time alarm: Set Repeat to "None" — fires once, then marks as Completed.
Possible problems:
Problem
Cause
Solution
Alarm fires at wrong time
Timezone mismatch
Go to Settings → Timezone and verify it matches your location
No notification received
Browser permissions denied
Allow notifications when prompted, or check browser settings
Alarm doesn't repeat
Repeat was set to "None"
Edit the task and change Repeat to Daily/Monthly/Yearly
4.3 Running a Pomodoro Session
When to use: You want to alternate between focused work periods and breaks.
Preconditions: Logged in.
Steps:
Dashboard → "New Task" → "Reminder".
Mode: Pomodoro.
Configure durations:
Work duration — default 25 minutes.
Break duration — default 5 minutes.
Long break duration — default 15 minutes.
Sessions before long break — default 4.
(Optional) Set Working hours (e.g., 9:00–18:00) — Pomodoro will auto-pause outside these hours.
Set Start At to when you want to begin.
Click "Create", then "Run".
Expected result: The task cycles: Work → Break → Work → Break → ... → Long Break → repeat. Notifications announce each transition. The task card shows the current session number and phase.
To stop: Click "Stop Pomodoro" on the task card, or deactivate the task.
Possible problems:
Problem
Cause
Solution
Pomodoro doesn't start next session
Outside working hours
Check your working period settings
Session count resets unexpectedly
Task was deactivated and reactivated
Session state is preserved in metadata — check if someone else deactivated via sharing
4.4 Learning with Spaced Repetition
When to use: You're memorizing content (vocabulary, formulas, etc.) and want increasing intervals between reviews.
Intra-Day: Reviews at 5, 15, 30, 60, 120, 240 minutes.
Enter the Content to memorize in the text field.
Set Start At to your first review time.
Click "Create", then "Run".
Expected result: After each notification, the task reschedules to the next interval. The task card shows progress (e.g., "Step 3 of 7"). After the last interval, the task marks as Completed.
Possible problems:
Problem
Cause
Solution
Progress shows wrong step
Task was reopened after completion
Reopening resets to Inactive; the repetition index is preserved in metadata
"Content to memorize" empty after completion
This is expected — review the content before the task completes
Copy important content before the final interval
4.5 Launching a Public Challenge
When to use: You want to create a public competition that other users can join.
Preconditions: Logged in. Email verified.
Steps:
Dashboard → "New Task" → "Challenge".
Enter Title — name of the challenge.
Enter Content — detailed rules and description.
Set Max Participants (leave empty for unlimited).
Click "Create", then "Run" to publish to the public feed.
Expected result: The challenge appears on the Feed page. Other users can join, submit completion reports, and appear on the challenge leaderboard.
Possible problems:
Problem
Cause
Solution
Challenge not visible on Feed
Task not activated (still Inactive)
Click "Run" to publish
No one can join
Max participants reached
Increase the limit or remove it
4.6 Sharing a Task with a Colleague
When to use: You want another user to see or act on your task.
Preconditions: Logged in. You have at least one accepted contact.
Steps:
Create or open an existing task.
On the task card, click "Share".
Select a contact from the list.
Choose a role:
WATCHER — they can view the task and comments (read-only).
ASSIGNEE — they can change the task status and post comments.
Confirm.
Expected result: The shared user sees the task in their "Shared with me" filter on the Dashboard. Comments and status changes appear for both parties.
When to use: Your watchdog timer is counting down and you want to extend the deadline.
Preconditions: Task is in Active status.
Steps:
Find the active task on the Dashboard.
Click the postpone button on the task card.
The timer extends by the configured postpone period.
Expected result: The countdown timer resets. Warning states (5-min, 2-min) are also reset.
Possible problems:
Problem
Cause
Solution
Postpone button not visible
Task is not Active (might be Inactive, Completed, or Failed)
Check the task status
Timer doesn't move after postpone
Network delay; server hasn't responded yet
Wait a moment; if it persists, refresh the page
4.8 Connecting with Another User
When to use: You want to share tasks, chat, or collaborate with someone.
Preconditions: Both users logged in. Both have verified emails.
Steps:
Go to the Chat page.
Click the "Contacts" tab.
Search for the user by their Search Tag (e.g., JohnDoe#48293). Minimum 3 characters.
Click "Send Request".
Wait for the other user to accept the request.
Expected result: Once accepted, the contact appears in your contacts list. You can now share tasks, start chats, and collaborate.
Contact states:
Pending — Request sent, waiting for response.
Accepted — Mutual connection established.
Blocked — All interaction disabled.
Possible problems:
Problem
Cause
Solution
Can't find user
Wrong search tag, or user's profile is private
Ask them for their exact search tag
"Contact limit reached"
Free tier: 1 contact
Upgrade tier or remove an existing contact
Search returns no results
Fewer than 3 characters entered
Type at least 3 characters
Rate limit error
Too many search requests
Wait 60 seconds and try again (limit: 10/min)
4.9 Recovering a Failed Task
When to use: A watchdog task shows Failed status after 3 retry attempts.
Preconditions: Task is in Failed (5) status.
Steps:
Find the failed task on the Dashboard — it displays a red error box with failure details.
Read the error message (e.g., "Failed after 3 attempts: SMTP connection refused").
Fix the root cause:
Wrong email? → Edit the subtask configuration.
API endpoint down? → Verify the webhook URL is accessible.
File too large? → Reduce attachment size.
Click "Deactivate" (red button) to reset the task to Inactive.
Make any needed edits.
Click "Run" to re-activate.
Expected result: The task returns to Active status and the timer starts counting down again.
Possible problems:
Problem
Cause
Solution
Same error repeats
Root cause not fixed
Check the error message carefully; verify subtask config
Can't edit while Failed
This is expected — deactivate first
Click "Deactivate", then edit
4.10 Using the App Offline
When to use: You lose internet connectivity but still need reminder notifications.
Preconditions: PWA installed, or recent visit to the site in a supported browser.
Steps:
Install the PWA — Click the install prompt on the landing page (or use browser's "Add to Home Screen").
When offline, an offline banner appears at the top of the screen.
Reminder tasks continue working — they are stored locally in IndexedDB and the service worker handles notifications.
Watchdog tasks require server connectivity — they will NOT fire offline (they are server-processed).
When you go back online, the sync engine pushes any local changes to the server.
Expected result: Reminders work offline. Watchdog tasks resume when connectivity is restored.
Possible problems:
Problem
Cause
Solution
No offline notifications
PWA not installed, or service worker not registered
Install the PWA from the landing page
Changes lost after reconnect
Sync engine conflict (very rare)
Refresh the page to force a re-sync
Watchdog fired while offline
Task expired on server; server processed it independently
This is correct behavior — watchdog timers are server-authoritative
5. Feature Reference
5.1 Dashboard
The Dashboard (/dashboard) is the main workspace.
Components:
Task list — Accordion-style cards. Click to expand for editing.
Search bar — Filter tasks by title text.
Status filter — Active, Inactive, Completed, Failed, or All.
Type filter — Reminder, Watchdog, Challenge, Personal Report.
"Shared with me" toggle — View tasks others have shared with you.
New task form — Inline creation with type selector and full configuration.
Real-time timers — Active tasks show live countdowns, updated every second.
Sync indicator — Shows whether local data is synced with the server.
Pagination — Navigate through large task lists.
Empty state: When you have no tasks, the dashboard shows a prompt to create your first task.
Loading state: Tasks show skeleton placeholders while loading from the server.
5.2 Watchdog (Dead Man's Switch)
What it does: Counts down to a deadline. If you don't postpone before the deadline, the task executes all attached subtasks (email, SMS, Telegram, etc.).
When to use: Failsafe scenarios — emergency contacts, document delivery, health checks, dead drops.
Parameters:
Parameter
Required
Description
Title
Yes
Task name
Description
No
Used as the push-notification payload when the task starts. Not the email body — that lives on each EMAIL subtask.
Postpone Period
Yes
Time added per postpone. The selectable options are: 5 Minutes, 10 Minutes, Hour, Day, Week, Month, Year. For Watchdog tasks, the effective floor is always at least 10 minutes — picking "5 Minutes" is automatically clamped on postpone.
Start At
Yes
When the timer fires. The form requires at least firstWarning + 1 minutes from now (6 min by default; configurable in Settings → Watchdog Warning Periods). Both the React validator and the native input's min attribute share this same threshold.
Subtasks
Yes (at least one)
Action chain: Email, SMS, Telegram, API Trigger, SSH commands, Home Assistant. Activating a Watchdog with no valid subtask is blocked with "watchdog requires at least one valid subtask". Existing legacy PUBLISH_INFO entries send press email only and never create Feed content.
Behavior on expiry:
Status changes to InProgress.
Backend worker executes all subtasks in configured order.
On success → Completed. On failure after 3 retries → Failed.
Bulk email to a list of addresses; never writes Feed
journalistEmails[], subject, content
SSH commands
Run commands on a remote server over SSH
host, port, username, credentials, commands
Link types control execution order:
Link Type
Behavior
Sequential
Subtasks run one after another, in order. The next subtask starts only after the previous one finished (success or final failure).
Parallel
Consecutive PARALLEL subtasks run simultaneously as one batch. One subtask's failure does not abort siblings in the same batch.
Blocking
Selectable in the form, but currently executes like Sequential — the chain pauses for the subtask's own completion (success or 3-retry exhaustion), then proceeds. There is no manual-confirmation gate today; that capability is not yet wired through the worker.
Adding subtasks:
When creating/editing a Watchdog task, click "Add Subtask".
Choose the subtask type.
Fill in the configuration (email address, webhook URL, SSH host and commands, etc.).
Set the link type.
Repeat for additional subtasks.
Configuring SSH commands:
Choose SSH commands as the subtask type.
Enter a public Host (domain or public IP) and Port (usually 22). Localhost, private network addresses, Docker service names, and cloud metadata hosts are blocked.
Enter the SSH Username.
Choose Password or Private key authentication. For private keys, paste the OpenSSH private key and add a passphrase only if the key is encrypted.
Enter one command per line. Commands run sequentially; a non-zero exit code or timeout makes the subtask fail and triggers the normal retry flow.
Optional: set Host key SHA256 to pin the server identity and Timeout (ms) for longer-running commands.
Use SSH commands for idempotent recovery or notification actions, such as restarting a service, writing a marker file, or running a backup hook. Avoid destructive commands unless you are comfortable with them being retried up to 3 times.
Execution: When the Watchdog fires, subtasks are grouped by link type and executed by the backend worker. Each subtask gets up to 3 retry attempts.
Note: SMS and Telegram are functional integrations, but they require valid third-party credentials or a configured DMH bot. SSH commands require the target SSH server to be reachable from the backend container over a public address. If credentials are missing, rejected, or the host is blocked by the network safety guard, that subtask fails and surfaces an error.
5.9 Postpone Mechanism
What it does: Resets the countdown to the configured postpone period starting from the current moment. Each postpone sets a fresh deadline of "now + period" — regardless of how much time was remaining.
Available periods (the form labels are exactly the left column — there is no "1 Minute" option):
Period
Time added
5 Minutes
+5 minutes
10 Minutes
+10 minutes
Hour
+60 minutes
Day
+24 hours
Week
+7 days
Month
+30 days
Year
+365 days
Minimum delay (Watchdog only): The effective postpone delay for a Watchdog task is always at least 10 minutes from now (DMS_MIN_DELAY_MS). If you set "5 Minutes" on a Watchdog and then postpone, the new deadline is clamped to now + 10 minutes — not now + 5 minutes. Reminder tasks use the table above verbatim.
Postpone resets warning states: If the 5-minute or 2-minute warning was already shown, postponing clears those warnings.
For recurring reminder tasks: The postpone button extends the current cycle. The task continues with its normal schedule after the postponed deadline.
5.10 Forced Start
What it does: A full-screen countdown page that appears when a Watchdog task reaches its deadline.
Access:/dashboard/forced-start/{task-id}
Elements:
Full-screen countdown showing seconds remaining.
"Postpone" button — delay by the configured period.
"Start immediately" button — trigger the task right now, without waiting.
Behavior:
Default countdown: 30 seconds (configurable in Settings from 5 to 300 seconds).
If the countdown reaches 0, the task fires automatically.
If you close the page, the backend still processes the task on schedule.
5.11 Notifications
DMH sends browser push notifications via Firebase Cloud Messaging and the Service Worker.
Notification triggers:
Event
Message
Condition
Watchdog 1st warning
"Watchdog '{title}' — X minutes left!"
Configurable (default: 5 min before expiry)
Watchdog 2nd warning
"Watchdog '{title}' — X minutes left!"
Configurable (default: 2 min before expiry)
Watchdog expired
"Watchdog '{title}' timer expired!"
Timer reaches 0
Pomodoro work starts
"Work session #N starting!"
Break ends
Pomodoro break starts
"Break time!" / "Long break time!"
Work session ends
Reminder fires
"'{title}' starts now!"
Timer reaches 0
Contact request
Notification in chat
Another user sends a contact request
Requirements:
Browser must allow notifications (prompted on first visit).
For reliable background notifications, install the PWA.
5.12 Contacts & User Search
Finding users:
Go to Chat page → Contacts tab.
Type at least 3 characters of a user's Search Tag.
Search results appear in real-time.
Search Tag format:Name#12345 — a unique identifier visible in each user's Settings.
Contact request flow:
Send request → status: Pending.
Recipient accepts → status: Accepted. Both users can now share tasks and chat.
Either user can block → all interaction disabled.
Rate limits:
Search: 10 requests per 60 seconds.
Contact invites: 20 per day.
Free tier limit: Maximum 1 accepted contact.
5.13 Task Sharing
Share any task with an accepted contact in one of two roles:
Role
View
Change Status
Comment
WATCHER
Yes
No
Yes
ASSIGNEE
Yes
Yes
Yes
How to share:
Open a task → click "Share".
Select a contact.
Choose role: WATCHER or ASSIGNEE.
The contact sees the task in their "Shared with me" view.
Free tier: Share with up to 1 unique user total.
5.14 Comments
Available on all shared tasks.
Visible to the task owner and all shared users.
Real-time delivery via WebSocket.
Delete your own comments (task owner can delete any comment).
5.15 Chat
Type: Real-time messaging via WebSocket (Socket.IO).
Features:
1-on-1 chats with accepted contacts.
Group chats with multiple contacts (Owner / Admin / Member roles).
Invite contacts by searching their Search Tag in the chat header.
Share tasks directly in chat — choose WATCHER or ASSIGNEE role.
Room invite gate: A new 1-on-1 room starts in PENDING status and becomes ACTIVE only after the invited contact accepts. Individual messages are not pre-moderated.
Requirement: Verified email address.
Access:/chat
Tabs:
Chats — List of active chat rooms.
Contacts — List of accepted contacts with shared task info.
5.16 Public Feed
What it does: A feed of public content organised into two tabs.
Access:/feed — no login required to view.
Tabs:
Templates — Ready-made challenge tasks you can clone into your own account.
Articles — Community articles and guides.
Actions:
"Use as Template" — Clones a task from a feed card for your own use (requires login).
"Join" — Join a challenge (requires login).
Challenge detail page (/challenges/{id}): each challenge card links to a detail page with stats, participants, and reports tabs plus a leaderboard of completion counts.
5.17 Settings
Access: Sidebar → gear icon → /users/settings
Setting
Description
Default
Search Tag
Your unique identifier for contacts. Includes a QR code.
Auto-generated
Timezone
Auto-detected from browser. Override manually if needed.
Browser timezone
Theme
Green (dark) or Violet (light) appearance.
Green
Forced Start Delay
Countdown duration before watchdog fires (5–300 seconds).
30 seconds
1st Warning Period
Minutes before expiry for first watchdog notification.
5 minutes
2nd Warning Period
Minutes before expiry for second watchdog notification.
2 minutes
Task Type Availability
Toggle which task types appear in the new task form.
All enabled
Profile Visibility
Public or private profile for user search.
Private
Passkeys (WebAuthn)
Manage hardware/biometric login credentials — register a new passkey for this account, list existing ones, revoke a passkey.
None registered
Active sessions
See every device currently signed in (label derived from the browser/User-Agent, last-active time, a "this device" badge). Log out an individual device, or log out all other devices at once.
This device
5.18 Tiers & Limits
Tier
Price
Active Watchdogs
Total Tasks
Contacts
Sharing
Chat
Free
$0
3
999
1
1 user
No
Tier 1
$1
10
999
—
—
—
Tier 2
$20
20
999
—
—
—
Tier 3
$300
30
999
—
—
—
Tier 4+
$100/tier
+10 per tier
999
—
—
—
"—" = details TBD for paid tiers.
Global safety caps — every tier, free or paid:999 tasks owned in total, and 99 tasks Active at once. Unlike the per-tier Active Watchdogs column, these two ceilings span all task types and are not raised by upgrading.
When you hit a limit:
A modal appears showing your current tier and the next tier's benefits/pricing.
Options: upgrade your tier to unlock more capacity.
Important: Unverified accounts (no confirmed email) are limited to free-tier features only, regardless of payment status.
Reminders do not consume watchdog slots — they are exempt from the tier-based Active Watchdogs limit, so you can keep creating them once your watchdog slots are full. A reminder kept only on your device counts toward nothing; one stored on the server still counts toward the global 999-task cap above.
5.19 Donations
Access:/donations
Support DMH's infrastructure via one-time donations. The payment methods shown depend on your detected region:
Region
Methods shown
Ukraine (Europe/Kiev timezone)
Monobank (card via Monobank Jar) and Crypto
Everywhere else
Stripe Checkout (card / Apple Pay / Google Pay)
Region detection runs on the donations page; you cannot switch the set manually from this screen.
5.20 PWA & Offline Mode
DMH is a Progressive Web App (PWA):
Feature
Description
Install
Click the install prompt on the landing page, or use browser's "Add to Home Screen"
Offline reminders
Reminder tasks continue working offline via Service Worker + IndexedDB
Sync engine
Local changes are queued and synced when connectivity returns
Offline banner
Visual indicator when you lose network connection
Background notifications
Service Worker handles notifications even when the app is closed
Register with email + password (min 8 chars, must include uppercase, lowercase, digit)
JWT-based sessions, 60-min access token; refresh token valid ~1 year and rolling (see "Staying logged in" below)
GitHub OAuth
Click "Sign in with GitHub"
Auto-verified email
Google OAuth
Click "Sign in with Google"
Auto-verified email
Passkey (WebAuthn)
Click "Sign in with passkey" on the login screen (or register one in Settings → Passkeys). Uses platform biometrics (Touch ID / Face ID / Windows Hello / hardware key) — no password required.
First passkey must be registered while logged in; the device's conditional UI also fires automatically on the login page when supported.
Telegram
Open DMH inside the Telegram app (Mini App / WebApp). Sign-in happens automatically from your verified Telegram identity — no password, no separate button.
Only inside the Telegram in-app browser. The GitHub/Google buttons are hidden there (their OAuth redirect can't complete in Telegram's webview).
Email verification:
Credential-registered users receive a verification email (link valid for 1 hour).
Some features (chat, sharing) require a verified email.
OAuth and Telegram users are automatically verified.
Staying logged in:
Every login path (email/password, passkey, Telegram, GitHub, Google) creates one ~1-year rolling session — there is no "Remember Me" choice (the old 30-day / 24-hour checkbox was removed).
The window is rolling: every token refresh (≈ hourly while the app is open) resets the 1-year clock, so an active user is effectively never logged out. Only ~1 year of complete inactivity lets the session expire — your next visit then asks you to sign in again.
Multiple devices:
Signing in on a second device no longer logs you out on the first — each device gets its own independent session.
Manage them in Settings → Active sessions: every signed-in device is listed (label, last-active time, a "this device" badge), with a Log out button per device and a Log out all other devices action.
Sessions (under the hood):
Access tokens auto-refresh ~10 minutes before expiry.
Refresh tokens rotate on each use; rotation affects only the current device, never your other sessions.
Logging out destroys that device's session (its tokens are deleted), leaving your other devices signed in.
Security — reuse detection: If a previously-rotated refresh token is replayed (e.g., an old cookie reused), DMH treats it as a theft signal and revokes that device's session only — you're logged out on the affected device, and your other devices keep working.
5.22 Challenge Check-ins & the Completion Checklist
What it does: Turns a Challenge into a recurring habit tracker. You declare when a check-in is due; DMH reminds you, waits for your confirmation, and records a green/red day on a calendar. Optionally, you also declare what counts as done — a checklist that must be fully ticked before the confirmation is accepted.
When to use: Daily habits (brushing, exercise, medication), multi-step routines you keep half-finishing, and anything an accountability partner should be able to see the history of.
Where: Create a task, pick the Challenge template, then open step 3 (Timing) of the editor. The check-in calendar itself appears on the task card once the challenge is running.
Schedule parameters:
Parameter
Required
Description
Complete by
Yes
Wall-clock time of the check-in, e.g. 08:00. Interpreted in the schedule's timezone, so it stays at 08:00 across DST changes.
Repeat interval (hours)
Yes
How often the check-in comes back. 24 = once a day; 8 = three times a day.
Repeat until
No
Last day of the course, inclusive. The challenge deactivates itself the following day. Empty = runs indefinitely.
First reminder
No
Minutes before the deadline for the first nudge. Default 5. When no ASSIGNEE is assigned, this remains when the check-in action becomes available to the owner or eligible WATCHER. A scheduled ASSIGNEE can use the current schedule-day checklist immediately; reminders are nudges and do not unlock their flow.
Second reminder
No
Minutes before the deadline for the final nudge. Default 2. Must be smaller than the first.
Completion checklist
No
Up to 20 mandatory items. Empty = confirm with a single tap.
Completion checklist — the confirm gate:
In step 3 of the editor, click Add checklist item and type what has to be done. Repeat for each step.
A scheduled ASSIGNEE sees and can tick the current schedule-day checklist immediately, including before the first reminder. When no ASSIGNEE is assigned, the owner or an eligible WATCHER receives the action on the reminder-based timing described above.
The single successful-completion action stays disabled until every item is ticked. A counter under the list shows progress (2 of 3 completed). Once accepted, that occurrence has one successful result.
Ticks apply to the check-in currently on screen. They reset when the panel moves to the next one, so yesterday's ticks can never satisfy today's check-in.
The rule is enforced on the server, not just in the browser — a confirmation that arrives without the full set is rejected, whatever sent it.
Nuances worth knowing:
Renaming an item does not reset it. Each row keeps a stable internal id, so editing the wording of "Warm up" mid-course does not invalidate anything.
Removing an item takes effect immediately for the next check-in; already-recorded history is untouched.
There is no manual failure or skip action. If no successful completion has been recorded by the configured Complete by deadline, DMH automatically writes the occurrence as MISSED.
A missed check-in can still be corrected the same day only. After the deadline the button becomes Correct missed completion, and the day is recorded as confirmed-late rather than silently repaired. Once the calendar day ends in your challenge timezone, the miss is final and can no longer be changed. Every checklist item still has to be ticked for a same-day correction.
Sharing changes who confirms and when. If the challenge is shared with an ASSIGNEE, only they can record success, and they can use the current-day checklist before reminders; the owner and all WATCHER users are read-only. With no assignee, the owner confirms; a WATCHER can also confirm only if Watcher can confirm is enabled, and those flows remain reminder-based.
Reading the calendar: green = every check-in that day confirmed, red = one or more check-ins missed with nothing salvaged, amber = today, mixed = a partly-confirmed multi-check-in day. Hovering a day shows the confirmation times.
5.23 Healthcheck (Service Monitor)
What it does: The inverse of the Watchdog. Instead of waiting for you to feed it, a Healthcheck actively goes and looks at something on a schedule, and raises the alarm only when the check fails. Silence means everything is fine.
When to use: Websites and APIs that must stay up, nightly backups and cron jobs that must keep reporting in, and physical spaces watched by a paired motion sensor.
Modes:
Mode
What it watches
Failure means
URL
A public HTTPS endpoint you supply. DMH sends a request and compares the status code (and optionally the body) against what you declared.
The probe did not return what you expect — after a 3-attempt retry cycle.
Device
A paired ESP32 motion sensor.
Alarm off: no motion within the interval — the thing that should be moving stopped. Alarm on: motion was seen — silence was the goal, so movement is the intrusion.
Parameters:
Parameter
Required
Description
Target URL
URL mode
Must be a public address. Private/internal addresses are refused (SSRF protection).
Expected status
No
Defaults to any 2xx.
Expected body contains
No
Substring the response must contain. Useful for "db":"connected"-style health payloads.
Interval
Yes
How often the check runs / how long silence is tolerated.
Alarm mode (device)
No
Inverts what motion means, as above.
What happens on failure: one push notification, plus the task's whole subtask chain — Telegram, email, an API call, an SSH command, whatever you attached (see 5.8 Subtasks). A Healthcheck reports only on failure, so the trigger journal on the task card is the record you pull to see what has been happening: every probe result, motion event, and external ping, with its outcome.
Nuances worth knowing:
Retries before the verdict. A single flaky response does not page you — the probe retries up to three times before the deadline.
It re-arms itself. After each interval the check restarts, so one task covers an indefinite period.
An external system can re-arm it too, by calling the task's ping URL — see 5.25 below.
Offline display still works. Existing Healthcheck tasks render their last-known state with no server connection; going offline only blocks creating new ones. The app also raises a local alert when the DMH backend itself becomes unreachable from your device.
5.24 Cooperative — Shared Free Time & Two-Person Confirmation
What it does: A named group of you plus invited contacts, providing two things that only make sense with other people involved: finding time everyone actually has, and requiring two different people to agree before something happens.
When to use: Households, small teams, and any action that is too consequential for one person to trigger alone.
Where: the Cooperative entry in the sidebar.
A — Free-time synchronizer
Create a cooperative and invite people from your accepted contacts.
Each member declares their own availability slots. DMH does not guess this from your calendar or your existing tasks — it is stated deliberately, by each person.
The app intersects the slots of the selected members and lists the windows where everyone is genuinely free.
A window can be turned straight into a task at that time.
B — Dual confirmation (the two-man rule)
Pick one of your tasks and the action to gate: Complete the task or Run the subtask chain.
Choose the confirmers — the people entitled to approve it.
The action waits. Two different members must confirm before DMH executes the effect.
Any confirmer can reject instead, which closes the action.
Nuances worth knowing:
Your own confirmation never counts toward the two. You created the action; the point is that other people agree.
The count and the effect are one atomic step, so a burst of simultaneous confirmations cannot execute the action twice or slip past the threshold.
Members must have accepted the invitation to confirm; a pending invite is not a vote.
Free time is declared, never inferred — a member with no declared slots simply narrows every intersection to nothing.
5.25 External Pings (Open API & MCP)
What it does: Lets machines, not just people, feed a task. Any Watchdog or Healthcheck can expose a public ping URL; anything that can make an HTTP request can re-arm it.
When to use: Nightly backups, cron jobs, CI pipelines, IoT devices — anything that should happen on a schedule, where silence past the deadline is the failure you want to hear about.
How:
Open the task and enable its ping URL. The task card shows the full address, and it stays re-displayable — you can copy it again later.
Every successful ping pushes the deadline forward. A missed ping means the job did not finish, and DMH alerts you.
Nuances worth knowing:
The key grants only "postpone earlier" — it cannot read your task, change its configuration, or fire it. That is why it is safe to paste into a crontab.
Setting it to disabled revokes it immediately.
Pings show up in the Healthcheck trigger journal as PING_RECEIVED.
For creating and managing checks programmatically, see the checks & pings API. For AI-assistant integration over the same tokens, see the MCP connector.
5.26 Backup & Export
What it does: Exports your tasks to a file you keep, and imports them back.
When to use: Before a big reorganisation, when moving between accounts, or simply because a dead man's switch you cannot rebuild is a single point of failure.
Where:Backup in the sidebar.
How:
Export produces an archive of your tasks and their configuration, prepared server-side and downloaded when ready.
Keep the file somewhere that is not DMH.
Import reads an archive back into your account, recreating the tasks it contains.
Nuances worth knowing:
Imported tasks arrive inactive. Nothing starts firing behind your back — you review them and start what you want.
Tier limits still apply on import: an archive holding more tasks than your tier allows will not lift the cap.
The archive contains your task data. Treat it like any other personal export and store it accordingly.
6. Error Handling
Known Errors and Solutions
Error
Where
Cause
Solution
"Tier limit reached"
Creating/activating a task
Free tier max 3 active watchdog tasks
Deactivate a task or upgrade tier
"Contact limit reached"
Sending contact request
Free tier max 1 contact
Remove a contact or upgrade
"Sharing limit reached"
Sharing a task
Free tier max 1 shared user
Remove a share or upgrade
"Email not verified"
Accessing chat, sharing
Account email not confirmed
Check inbox for verification link, or click "Resend"
"Value must be <timestamp> or later" or "watchdog must start at least N minutes from now"
Creating a watchdog
Start time below firstWarning + 1 minutes from now (6 min by default — rises with Settings → Watchdog Warning Periods)
Pick a later time, or shorten the warning period in Settings
"Invalid password"
Registration
Password doesn't meet requirements
Use min 8 chars with uppercase, lowercase, and digit
"Session expired"
Any authenticated action
Access token expired and refresh failed
Log in again
Rate Limits
Action
Limit
Login
5 attempts / minute
Registration
3 attempts / minute
User search
10 / 60 seconds
7. FAQ
Q: Can I use DMH without creating an account?
A: You can browse the public Feed without logging in. All other features require an account.
Q: What happens if I close the browser while a watchdog is running?
A: The watchdog continues counting down on the server. If the timer expires, the server executes the subtasks regardless of whether your browser is open.
Q: Can I have multiple watchdog tasks running at the same time?
A: Yes, up to your tier's limit (3 for free tier, more for paid tiers). Each task has its own independent timer.
Q: What happens to my reminders if I clear browser data?
A: Local reminders (stored in IndexedDB) will be lost. Server-backed tasks are unaffected. Re-install the PWA and the sync engine will restore server tasks.
Q: Can I change the postpone period after creating a task?
A: Yes. Click the task to expand it, change the postpone period, and save.
Q: How accurate are the timers?
A: Frontend timers update every second and display real-time countdowns. Server scheduling runs every minute, so actual execution happens within a 1-minute window of the target time.
Q: Can I attach files to watchdog emails?
A: Yes. Supported formats: .zip, .rar, .7z, .tar, .gz. Files are attached to the outgoing email when the watchdog fires.
Q: What's the difference between "Deactivate" and "Delete"?
A: Deactivate stops the task and returns it to Inactive — you can re-run it later. Delete permanently removes the task and all its subtasks.
Q: Can I postpone a task from my phone?
A: Yes — install the PWA on mobile and use the postpone button on the task card directly from your phone's browser.
Q: Why can't I access chat?
A: Chat requires a verified email address. Check your inbox for a verification link, or go to Settings and click "Resend verification email".
Q: Will I stay logged in if I close my browser?
A: Yes. DMH keeps one ~1-year rolling session — there's no "Remember Me" choice anymore. As long as you open the app at least once in a while, you stay signed in across browser and device restarts; only ~1 year of complete inactivity logs you out.
Q: Can I see and manage the devices I'm logged in on?
A: Yes — go to Settings → Active sessions. You'll see every signed-in device with its label and last-active time. You can log out a single device, or "Log out all other devices" to keep only the one you're on.
Q: One of my devices was logged out unexpectedly — why?
A: DMH's security system likely detected a suspicious reuse of an old session token on that device (a previously rotated refresh token was replayed) and revoked that device's session as a precaution. Your other devices are unaffected — just sign in again on the affected one. If it keeps happening, contact support.
Q: How do I stop a Pomodoro timer?
A: Click "Stop Pomodoro" on the task card, or click "Deactivate". Both stop the cycle and preserve your session count.
Q: What does "Shared with me" show?
A: Tasks that other users have shared with you (as WATCHER or ASSIGNEE). You can filter by this on the Dashboard.
Q: Can someone I share a task with see my other tasks?
A: No. They only see the specific tasks you've explicitly shared with them.
Q: What happens when a spaced repetition task completes all intervals?
A: The task automatically transitions to Completed status. You can reopen it to start the sequence again.
8. Troubleshooting
Decision Tree: "My task didn't fire"
Task didn't fire
│
├─ Is the task status "Active"?
│ ├─ No → Click "Run" to activate it
│ └─ Yes ↓
│
├─ Has the start time passed?
│ ├─ No → Wait for the scheduled time
│ └─ Yes ↓
│
├─ Is the task a Watchdog?
│ ├─ Yes → Check if the forced start countdown is blocking
│ │ (Settings → Forced Start Delay)
│ └─ No ↓
│
├─ Check task status:
│ ├─ InProgress → Backend is processing. Wait 1-2 minutes.
│ ├─ Completed → Task already fired successfully.
│ ├─ Failed → See scenario 4.9 (Recovery).
│ └─ Inactive → Task was deactivated. Re-run it.
│
└─ Still not firing?
├─ Check timezone (Settings → Timezone)
└─ Refresh the page to re-sync with server time
Decision Tree: "I'm not receiving notifications"
No notifications
│
├─ Did you allow browser notifications?
│ ├─ No → Go to browser settings → Allow notifications for this site
│ └─ Yes ↓
│
├─ Are you using a supported browser?
│ ├─ No → Use Chrome, Firefox, Edge, or Safari 16+
│ └─ Yes ↓
│
├─ Is the task Active?
│ ├─ No → Activate the task first
│ └─ Yes ↓
│
├─ Is the PWA installed? (for background notifications)
│ ├─ No → Install PWA for reliable background notifications
│ └─ Yes ↓
│
├─ On mobile?
│ ├─ Yes → Check OS notification settings for the PWA/browser
│ └─ No ↓
│
├─ Check if "Do Not Disturb" is active on your device
│
└─ Try: close and reopen the app, or refresh the page
Common Problems
"Nothing works — page won't load"
Check your internet connection.
Try a hard refresh (Ctrl+Shift+R / Cmd+Shift+R).
Clear browser cache for the site.
Try a different browser.
Check if the service is down (visit the landing page).
"Everything broke after an update"
Hard refresh the page (Ctrl+Shift+R).
Clear site data (cookies + cache).
Uninstall and reinstall the PWA.
Log out and log in again.
"My data disappeared"
Check that you're logged into the correct account (email vs. OAuth).
Check the status filter on the Dashboard — you might be filtering out your tasks.
Local-only reminders (offline) are tied to the device/browser. Clearing browser data removes them.
Server tasks are never lost — if they don't appear, try refreshing or logging out/in.
"Timer shows wrong time"
Go to Settings → Timezone and verify it matches your actual location.
The app uses server time for synchronization. Check that your device clock is reasonably accurate.
Refresh the page to re-sync the time offset from the server.
"Chat not accessible"
Verify your email address is confirmed (check for verification link in inbox).
Chat requires a verified email. Go to Settings → "Resend verification email" if needed.
"Hit a tier limit"
A modal will display your current tier and upgrade options.
Upgrade your tier to unlock more capacity.
9. Advanced Usage
Complex Subtask Chains
For advanced Watchdog setups, chain multiple subtasks in the task editor:
Sequential chain: Email → SMS → Telegram
Subtasks run one after another in the order you added them.
Parallel chain: Send Email + SMS + Telegram all at once.
Fastest delivery; all subtasks start simultaneously.
Blocking chain: Email → BLOCKING → next subtask
After the first subtask completes, the chain pauses until you manually confirm to continue.
Useful for two-phase escalation: notify first, confirm before the next action.
Document History
Version
Date
Changes
2.4
2026-06-07
Auth/session overhaul sync: §5.21 rewritten for the single ~1-year rolling session (the 30-day / 24-hour "Remember Me" choice was removed) and the new multi-device model — each device keeps its own session, Settings → Active sessions lists/logs-out devices, and reuse-detection now revokes only the affected device instead of all sessions; added Telegram as a sign-in method (auto sign-in inside the Telegram WebApp); §5.17 Settings gained an "Active sessions" row; §7 FAQ updated (stay-logged-in answer, new "manage devices" question, per-device logout); Glossary gained Session/Device.
2.3
2026-05-18
Code cross-check sweep: fixed §5.9 postpone-period table (Period 1 is "5 Minutes", not "1 Minute"; full list now matches DELAY_MAP); §5.2 Watchdog parameters now describes Description as the push payload (not the email body), with subtask payload requirement; §5.2 / §4.1 / §6 start-time guard now consistently reads "firstWarning + 1 minutes (default 6)" after the F-1 fix collapsed the native-min and React-validator paths to a single source of truth; §5.8 BLOCKING link-type clarified — current engine treats it as Sequential; §5.15 removed the inaccurate "Pre-moderation" line, replaced with the room-invite gate that actually exists; §5.17 Settings table now lists Passkey management; §5.19 Donations table now shows regional split (Monobank+Crypto for UA, Stripe elsewhere); §5.21 added Passkey/WebAuthn sign-in method.
2.2
2026-05-05
Removed infrastructure-only sections (External API, IoT, webhooks, referral program); corrected feed tabs (Templates/Articles); updated donations to Monobank/Crypto; leaderboard moved to challenge detail description; renumbered sections 5.17–5.21
2.1
2026-04-28
Remember Me login (30-day vs 24-hour sessions); refresh token reuse detection; theme labels Green/Violet; feed localization note