Back to Documentation
DocsDMH — User Guide

DMH — User Guide

DMH — User Guide

Version 2.4 | Updated: 2026-06-07 | App version: 0.2.x


Table of Contents

StartConceptsScenariosTasksSocialReference
Glossary3. Concepts4. Scenarios5.1 Dashboard5.13 Sharing6. Errors
1. IntroTasksDead Man's Switch5.2 Watchdog5.14 Comments7. FAQ
What is DMH?LifecycleDaily Alarm5.3 Alarm5.15 Chat8. Troubleshoot
Who is it for?TypesPomodoro5.4 Pomodoro

DMH (Dead Man's Hand) — Watchdog timer and postponed reminder system

5.16 Feed
Task didn't fire
What it solvesSubtasksSpaced Rep5.5 Spaced Rep5.17 SettingsNo notifications
NOT includedContactsChallenge5.6 Challenge5.18 TiersCommon Problems
2. Quick StartTiersSharing5.7 Report5.19 Donations9. Advanced
Postponing5.8 Subtasks5.20 PWASubtask Chains
Add Contact5.9 Postpone5.21 Auth
Failed Task5.10 Forced Start
Offline5.11 Notifications
5.12 Contacts
BasicsFeaturesHelp
Glossary5.1 Dashboard6. Errors
1. Intro5.2 Watchdog7. FAQ
What is DMH?5.3 Alarm8. Troubleshoot
Who is it for?5.4 PomodoroTask didn't fire
What it solves5.5 Spaced RepNo notifications
NOT included5.6 ChallengeCommon Problems
2. Quick Start5.7 Report9. Advanced
3. Concepts5.8 SubtasksSubtask Chains
Tasks / Lifecycle5.9 Postpone
Types / Subtasks5.10 Forced Start
Contacts / Tiers5.11 Notifications
4. Scenarios5.12 Contacts
Dead Man's Switch5.13 Sharing
Daily Alarm5.14 Comments
Pomodoro5.15 Chat
Spaced Rep5.16 Feed
Challenge5.17 Settings
Sharing5.18 Tiers
Postponing5.19 Donations
Add Contact5.20 PWA
Failed Task5.21 Auth
Offline5.22 Check-ins & Checklist
5.23 Healthcheck
5.24 Cooperative
5.25 External Pings
5.26 Backup & Export

Glossary

Read this first if you're new — these terms are used throughout the guide.

TermDefinition
TaskThe 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
ReminderA task type that fires at a scheduled time, with optional recurrence (Alarm, Pomodoro, Spaced Repetition)
ChallengeA public task type that other users can join and compete in
Personal ReportA private task type shared between two users
SubtaskAn action (Email, SMS, Telegram, API, Publish, SSH commands) attached to a Watchdog task
Action ChainA sequence of subtasks with defined execution order
PostponeExtending a task's deadline by the configured time period
Forced StartFull-screen countdown page that appears when a Watchdog reaches its deadline
TierYour subscription level, which determines resource limits
Search TagYour unique identifier for contacts (format: Name#12345)
WATCHERA sharing role with read-only access to a task
ASSIGNEEA sharing role with write access to a task's status and comments
FeedPublic page showing challenge invites and publications
PWAProgressive Web App — installable version with offline support
Service WorkerBackground process that handles notifications and offline functionality
Session / DeviceOne 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?

ProblemDMH 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 phone or 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.

  1. Sign up — Go to the homepage and click "Get Started", or sign in with GitHub / Google.

  2. Verify your email (optional but recommended) — Check your inbox and click the verification link. Some features (chat, sharing) require this.

  3. Create a task — On the Dashboard, click "New Task". Select "Watchdog Timer".

  4. 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)
  5. 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.)

  6. Activate — Click "Create", then click "Run" on the new task card.

  7. 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

TypePurposeFires WhenRepeats?
WatchdogDead man's switch — automated actions if you stop checking inTimer reaches 0 and you don't postponeNo (one-shot)
Reminder — AlarmClassic alarm with optional recurrenceScheduled time arrivesOptional: Daily, Monthly, Yearly
Reminder — PomodoroWork/break productivity cyclesEach cycle endsYes (infinite until stopped)
Reminder — Spaced RepetitionMemory training with expanding intervalsNext interval arrivesYes (until all intervals complete)
ChallengePublic competition with participantsPublished to feed immediatelyNo
Personal ReportPrivate shared ticket for collaborationShared immediately when createdNo

Subtasks (Action Chains)

Subtasks are actions attached to a Watchdog task that execute when the timer fires. You can chain multiple subtasks together.

Watchdog timer expires
       │
       ▼
 ┌─ Subtask Chain ──────────────────────┐
 │                                       │
 │  Email → SMS → Telegram → API call   │
 │     (sequential, parallel,            │
 │      or blocking execution)           │
 │                                       │
 └───────────────────────────────────────┘

Contacts & Sharing

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:

  1. Dashboard → "New Task" → select "Watchdog Timer".
  2. Enter a Title (e.g., "Emergency contact alert").
  3. 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.)
  4. Set Postpone Period to how often you plan to check in (e.g., "Day").
  5. 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.
  6. Click "Add Subtask" → "Email":
    • Enter recipient email, subject, content.
    • Optionally attach a file (.zip, .rar, .7z, .tar, .gz).
  7. (Optional) Add more subtasks: SMS, Telegram, API Trigger, SSH command, or Home Assistant.
  8. Click "Create".
  9. On the task card, click "Run" to activate.
  10. 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:

ProblemCauseSolution
"Create" button disabledRequired 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" modalFree tier allows max 3 active watchdog tasksDeactivate or delete an existing task, or upgrade tier
Start time rejectedForm 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:

  1. Dashboard → "New Task" → "Reminder".
  2. Mode: Alarm.
  3. Repeat: Daily.
  4. Select which weekdays the alarm should fire (default: all 7 days). Click days to toggle.
  5. Set Start At to the desired time (e.g., 08:00 tomorrow).
  6. Toggle Sound on/off.
  7. 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:

ProblemCauseSolution
Alarm fires at wrong timeTimezone mismatchGo to Settings → Timezone and verify it matches your location
No notification receivedBrowser permissions deniedAllow notifications when prompted, or check browser settings
Alarm doesn't repeatRepeat 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:

  1. Dashboard → "New Task" → "Reminder".
  2. Mode: Pomodoro.
  3. Configure durations:
    • Work duration — default 25 minutes.
    • Break duration — default 5 minutes.
    • Long break duration — default 15 minutes.
    • Sessions before long break — default 4.
  4. (Optional) Set Working hours (e.g., 9:00–18:00) — Pomodoro will auto-pause outside these hours.
  5. Set Start At to when you want to begin.
  6. 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:

ProblemCauseSolution
Pomodoro doesn't start next sessionOutside working hoursCheck your working period settings
Session count resets unexpectedlyTask was deactivated and reactivatedSession 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.

Preconditions: Logged in.

Steps:

  1. Dashboard → "New Task" → "Reminder".
  2. Mode: Spaced Repetition.
  3. Choose format:
    • Multi-Day: Reviews at 1, 3, 7, 14, 30, 60, 120 days.
    • Intra-Day: Reviews at 5, 15, 30, 60, 120, 240 minutes.
  4. Enter the Content to memorize in the text field.
  5. Set Start At to your first review time.
  6. 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:

ProblemCauseSolution
Progress shows wrong stepTask was reopened after completionReopening resets to Inactive; the repetition index is preserved in metadata
"Content to memorize" empty after completionThis is expected — review the content before the task completesCopy 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:

  1. Dashboard → "New Task" → "Challenge".
  2. Enter Title — name of the challenge.
  3. Enter Content — detailed rules and description.
  4. Set Max Participants (leave empty for unlimited).
  5. 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:

ProblemCauseSolution
Challenge not visible on FeedTask not activated (still Inactive)Click "Run" to publish
No one can joinMax participants reachedIncrease 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:

  1. Create or open an existing task.
  2. On the task card, click "Share".
  3. Select a contact from the list.
  4. Choose a role:
    • WATCHER — they can view the task and comments (read-only).
    • ASSIGNEE — they can change the task status and post comments.
  5. 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.

Possible problems:

ProblemCauseSolution
"Share" option not visibleNo accepted contactsAdd a contact first (see 4.8)
"Sharing limit reached"Free tier: 1 unique shared userUpgrade tier or remove existing shares
Shared user can't editThey have WATCHER roleChange their role to ASSIGNEE

4.7 Postponing a Watchdog Timer

When to use: Your watchdog timer is counting down and you want to extend the deadline.

Preconditions: Task is in Active status.

Steps:

  1. Find the active task on the Dashboard.
  2. Click the postpone button on the task card.
  3. 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:

ProblemCauseSolution
Postpone button not visibleTask is not Active (might be Inactive, Completed, or Failed)Check the task status
Timer doesn't move after postponeNetwork delay; server hasn't responded yetWait 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:

  1. Go to the Chat page.
  2. Click the "Contacts" tab.
  3. Search for the user by their Search Tag (e.g., JohnDoe#48293). Minimum 3 characters.
  4. Click "Send Request".
  5. 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:

ProblemCauseSolution
Can't find userWrong search tag, or user's profile is privateAsk them for their exact search tag
"Contact limit reached"Free tier: 1 contactUpgrade tier or remove an existing contact
Search returns no resultsFewer than 3 characters enteredType at least 3 characters
Rate limit errorToo many search requestsWait 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:

  1. Find the failed task on the Dashboard — it displays a red error box with failure details.
  2. Read the error message (e.g., "Failed after 3 attempts: SMTP connection refused").
  3. 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.
  4. Click "Deactivate" (red button) to reset the task to Inactive.
  5. Make any needed edits.
  6. Click "Run" to re-activate.

Expected result: The task returns to Active status and the timer starts counting down again.

Possible problems:

ProblemCauseSolution
Same error repeatsRoot cause not fixedCheck the error message carefully; verify subtask config
Can't edit while FailedThis is expected — deactivate firstClick "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:

  1. Install the PWA — Click the install prompt on the landing page (or use browser's "Add to Home Screen").
  2. When offline, an offline banner appears at the top of the screen.
  3. Reminder tasks continue working — they are stored locally in IndexedDB and the service worker handles notifications.
  4. Watchdog tasks require server connectivity — they will NOT fire offline (they are server-processed).
  5. 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:

ProblemCauseSolution
No offline notificationsPWA not installed, or service worker not registeredInstall the PWA from the landing page
Changes lost after reconnectSync engine conflict (very rare)Refresh the page to force a re-sync
Watchdog fired while offlineTask expired on server; server processed it independentlyThis 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:

ParameterRequiredDescription
TitleYesTask name
DescriptionNoUsed as the push-notification payload when the task starts. Not the email body — that lives on each EMAIL subtask.
Postpone PeriodYesTime 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 AtYesWhen 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.
SubtasksYes (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:

  1. Status changes to InProgress.
  2. Backend worker executes all subtasks in configured order.
  3. On success → Completed. On failure after 3 retries → Failed.

Warnings:

  • 1st warning — Configurable (default: 5 minutes before expiry). Browser push notification.
  • 2nd warning — Configurable (default: 2 minutes before expiry). Browser push notification.
  • Expired — Notification sent. Forced start page appears.

5.3 Reminder — Alarm

What it does: Fires a notification at a scheduled time, with optional recurrence.

When to use: Any time-based reminder — meetings, medication, daily routines.

Parameters:

ParameterRequiredDescription
TitleYesAlarm name
RepeatYesNone, Daily, Monthly, Yearly
WeekdaysOnly for DailyWhich days to fire (Mon–Sun, all selected by default)
SoundNoEnable/disable notification sound
Start AtYesFirst fire time

Repeat behavior:

RepeatAfter trigger...
NoneTask marks as Completed
DailyReschedules to the next matching weekday at the same time
MonthlyReschedules to the same date next month
YearlyReschedules to the same date next year

Example: Daily alarm at 08:00, weekdays Mon/Wed/Fri. Fires Monday 08:00 → next is Wednesday 08:00 → next is Friday 08:00 → next is Monday 08:00.


5.4 Reminder — Pomodoro

What it does: Cycles through work and break periods for focused productivity.

When to use: Study sessions, deep work, creative tasks.

Parameters:

ParameterDefaultDescription
Work duration25 minHow long each work session lasts
Break duration5 minShort break between sessions
Long break duration15 minBreak after N sessions
Sessions before long break4How many work sessions before a long break
Working period start09:00Auto-pause before this hour
Working period end18:00Auto-pause after this hour

Cycle:

Work (25m) → Break (5m) → Work (25m) → Break (5m) → Work (25m) → Break (5m) → Work (25m) → Long Break (15m) → repeat

Notifications: Each transition triggers a browser notification:

  • Work starts: "Work session #N starting!"
  • Break starts: "Break time!" or "Long break time!"

Stopping: Click "Stop Pomodoro" on the task card. The task deactivates and preserves session state.


5.5 Reminder — Spaced Repetition

What it does: Schedules reviews at scientifically-proven expanding intervals to optimize memorization.

When to use: Language learning, exam prep, memorizing any content.

Formats:

FormatIntervalsTotal duration
Multi-Day1 → 3 → 7 → 14 → 30 → 60 → 120 days~235 days
Intra-Day5 → 15 → 30 → 60 → 120 → 240 minutes~7.8 hours

Parameters:

ParameterRequiredDescription
FormatYesMulti-Day or Intra-Day
Content to memorizeNoText content for review (shown on task card)
Start AtYesFirst review time

Progress display: The task card shows "Step X of Y" and a visual progress indicator for each interval.

Completion: After the last interval, the task automatically marks as Completed.


5.6 Challenge (Public Ticket)

What it does: Creates a public competition visible on the Feed. Other users can join and submit completion reports.

When to use: Community goals, group accountability, fitness challenges.

Parameters:

ParameterRequiredDescription
TitleYesChallenge name
ContentYesRules and description
Max ParticipantsNoLimit on participants (empty = unlimited)

Lifecycle:

  1. Creator makes a Challenge task and clicks "Run".
  2. Challenge appears on the Feed as a card.
  3. Other users click "Join" on the feed card.
  4. Participants submit completion reports.
  5. Stats and a leaderboard track progress.

Accessible at: /challenges/{id} for detailed stats, participants, and reports.


5.7 Personal Report (Private Ticket)

What it does: A private task shared between you and another user for collaboration.

When to use: Delegating work, accountability partnerships, private reporting.

Parameters:

ParameterRequiredDescription
TitleYesTask name
ContentYesDescription
Shared withYesContact to share with
RoleYesASSIGNEE or WATCHER

Roles:

RoleCan viewCan change statusCan comment
WATCHERYesNoYes
ASSIGNEEYesYes (Complete/Fail)Yes

Not visible on the public feed. Only the owner and shared users can see it.


5.8 Subtasks (Action Chains)

Subtasks are actions attached to a Watchdog task. When the timer expires, subtasks execute in a defined order.

Subtask types:

TypeDescriptionConfiguration
EmailSend email with subject, body, optional attachmentsrecipientEmail, subject, content, archiveFile
SMSSend SMS messagephoneNumber, message
TelegramSend Telegram messagebotToken (or use DMH bot), chatId, message, parseMode
API TriggerHTTP request to an external webhookwebhookUrl, method (POST/GET/PUT/DELETE), headers, body, retryAttempts
Publish Info (legacy)Bulk email to a list of addresses; never writes FeedjournalistEmails[], subject, content
SSH commandsRun commands on a remote server over SSHhost, port, username, credentials, commands

Link types control execution order:

Link TypeBehavior
SequentialSubtasks run one after another, in order. The next subtask starts only after the previous one finished (success or final failure).
ParallelConsecutive PARALLEL subtasks run simultaneously as one batch. One subtask's failure does not abort siblings in the same batch.
BlockingSelectable 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:

  1. When creating/editing a Watchdog task, click "Add Subtask".
  2. Choose the subtask type.
  3. Fill in the configuration (email address, webhook URL, SSH host and commands, etc.).
  4. Set the link type.
  5. Repeat for additional subtasks.

Configuring SSH commands:

  1. Choose SSH commands as the subtask type.
  2. 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.
  3. Enter the SSH Username.
  4. Choose Password or Private key authentication. For private keys, paste the OpenSSH private key and add a passphrase only if the key is encrypted.
  5. 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.
  6. 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):

PeriodTime 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:

EventMessageCondition
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 requestNotification in chatAnother user sends a contact request

Requirements:

  • Browser must allow notifications (prompted on first visit).
  • Supported browsers: Chrome, Firefox, Edge, Safari 16+.
  • For reliable background notifications, install the PWA.

5.12 Contacts & User Search

Finding users:

  1. Go to Chat page → Contacts tab.
  2. Type at least 3 characters of a user's Search Tag.
  3. Search results appear in real-time.

Search Tag format: Name#12345 — a unique identifier visible in each user's Settings.

Contact request flow:

  1. Send request → status: Pending.
  2. Recipient accepts → status: Accepted. Both users can now share tasks and chat.
  3. 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:

RoleViewChange StatusComment
WATCHERYesNoYes
ASSIGNEEYesYesYes

How to share:

  1. Open a task → click "Share".
  2. Select a contact.
  3. Choose role: WATCHER or ASSIGNEE.
  4. 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).

Only public challenges that their owner has started (ACTIVE) appear in the feed. The server also refuses a join after a challenge is deactivated, completed, or failed, so an old detail link cannot bypass that lifecycle rule.

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

SettingDescriptionDefault
Search TagYour unique identifier for contacts. Includes a QR code.Auto-generated
TimezoneAuto-detected from browser. Override manually if needed.Browser timezone
ThemeGreen (dark) or Violet (light) appearance.Green
Date formatHow dates are written app-wide. Options spell the month as a word so day and month can never be confused; see Dates and times.Match my language
Time format24-hour or 12-hour clock.Match my language
Forced Start DelayCountdown duration before watchdog fires (5–300 seconds).30 seconds
1st Warning PeriodMinutes before expiry for first watchdog notification.5 minutes
2nd Warning PeriodMinutes before expiry for second watchdog notification.2 minutes
Task Type AvailabilityToggle which task types appear in the new task form.All enabled
Profile VisibilityPublic 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 sessionsSee 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

Dates and times

Every date and time in DMH is written the same way, everywhere — the dashboard clock, the feed, task deadlines, session lists, backup timestamps. Two settings control it, both under Settings → Interface, and each option shows a live example of itself so you can pick by looking rather than by reading.

Why this is a setting. Written as numbers, 05/09/2026 means 5 September in most of the world and 9 May in the United States. Nothing on screen tells you which, so the same row can be read two ways. Every option below except Match my language removes that ambiguity by spelling the month as a word (or by using the ISO standard). Once the month is a word, it no longer matters which end the day is on — you cannot misread it either way.

Date formatExampleWhen to pick it
Match my language (default)5/9/2026 in English, 09.05.2026 in UkrainianYou are happy with your language's usual convention. This is what DMH did before the setting existed. Note it is the one option that stays ambiguous.
Day first9 May 2026The order most of the world reads, with the month spelled out.
Month firstMay 9, 2026The order common in the United States, with the month spelled out.
Year-month-day (ISO)2026-05-09The international standard (ISO 8601). Unambiguous, and it sorts correctly as plain text.

The month name always appears in your chosen interface language: a Ukrainian interface shows 9 трав. 2026.

Japanese and Chinese have no month word — the month is a number followed by a marker character. In those languages the day-first and month-first options both render the language's own written form, 2026年5月9日, where the markers make the reading unambiguous instead.

Time formatExample
Match my language (default)Whatever your language normally uses
24-hour14:42
12-hour02:42 PM

Two details worth knowing.

  • The choice is per device, stored alongside your theme and interface scale — so you can read ISO dates on a work laptop and spelled-out months on your phone, under the same account.
  • Times are shown in the timezone from Settings → Timezone, not the timezone of the device you happen to be holding.

The dashboard's live header clock is the one place that also shows seconds, because it ticks. Everywhere else the time is hours and minutes.


5.18 Tiers & Limits

TierPriceActive WatchdogsTotal TasksContactsSharingChat
Free$0399911 userNo
Tier 1$110999———
Tier 2$2020999———
Tier 3$30030999———
Tier 4+$100/tier+10 per tier999———

"—" = 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

The page is public: you can view funding status and donate without signing in. When a session exists, it is used only as optional identity context.

Support DMH's infrastructure via one-time donations. The payment methods shown depend on your detected region:

RegionMethods shown
Ukraine (Europe/Kiev timezone)Monobank (card via Monobank Jar) and Crypto
Everywhere elseStripe Checkout when the operator has explicitly enabled it, plus Crypto

Region detection runs on the donations page; you cannot switch the set manually from this screen. Stripe is shown only when both the deployment enables its UI flag and the backend is configured with live/test Stripe secrets. On the .onion mirror, card providers are unavailable and this page offers crypto only.


5.20 PWA & Offline Mode

DMH is a Progressive Web App (PWA):

FeatureDescription
InstallClick the install prompt on the landing page, or use browser's "Add to Home Screen"
Offline remindersReminder tasks continue working offline via Service Worker + IndexedDB
Sync engineLocal changes are queued and synced when connectivity returns
Offline bannerVisual indicator when you lose network connection
Background notificationsService Worker handles notifications even when the app is closed

What works offline:

  • Reminder tasks (Alarm, Pomodoro, Spaced Repetition) — stored locally.
  • Viewing cached pages.
  • Creating local reminder tasks.

What requires connectivity:

  • Watchdog tasks (server-processed).
  • Chat, sharing, feed, challenges.
  • Account and payment operations.

5.21 Authentication

Methods:

MethodHowDetails
Email & PasswordRegister 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 OAuthClick "Sign in with GitHub"Auto-verified email
Google OAuthClick "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.
TelegramOpen 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:

ParameterRequiredDescription
Complete byYesWall-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)YesHow often the check-in comes back. 24 = once a day; 8 = three times a day.
Repeat untilNoLast day of the course, inclusive. The challenge deactivates itself the following day. Empty = runs indefinitely.
First reminderNoMinutes 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 reminderNoMinutes before the deadline for the final nudge. Default 2. Must be smaller than the first.
Completion checklistNoUp to 20 mandatory items. Empty = confirm with a single tap.

Completion checklist — the confirm gate:

  1. In step 3 of the editor, click Add checklist item and type what has to be done. Repeat for each step.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

ModeWhat it watchesFailure means
URLA 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.
DeviceA 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:

ParameterRequiredDescription
Target URLURL modeMust be a public address. Private/internal addresses are refused (SSRF protection).
Expected statusNoDefaults to any 2xx.
Expected body containsNoSubstring the response must contain. Useful for "db":"connected"-style health payloads.
IntervalYesHow often the check runs / how long silence is tolerated.
Alarm mode (device)NoInverts 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

  1. Create a cooperative and invite people from your accepted contacts.
  2. 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.
  3. The app intersects the slots of the selected members and lists the windows where everyone is genuinely free.
  4. A window can be turned straight into a task at that time.

B — Dual confirmation (the two-man rule)

  1. Pick one of your tasks and the action to gate: Complete the task or Run the subtask chain.
  2. Choose the confirmers — the people entitled to approve it.
  3. The action waits. Two different members must confirm before DMH executes the effect.
  4. Any confirmer can reject instead, which closes the action.

Nuances worth knowing:

  • The creator counts only when explicitly included in the confirmer roster. Creating the action alone is never an approval.
  • The count and the effect share a Serializable transaction. Simultaneous decisions are ordered, and only genuine database serialization/deadlock conflicts are retried.
  • Run-subtasks approval and dispatch are separate, guarded steps. The second approval marks the action confirmed; the canonical chain runner atomically claims it before sending anything. Scheduled and manual runs cannot both spend the same approval.
  • Manual Run reports what happened. A gated, inactive, already-dispatched, or empty chain is reported as such instead of being shown as successfully started.
  • 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:

  1. 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.

  2. Append the call to the end of the job:

    0 3 * * * /opt/backup.sh && curl -fsS "https://dmh.syntrope.app/api/checks/<key>/ping"
    
  3. 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:

  1. Export produces a ZIP prepared server-side. You can include tasks (the default) or export settings only; when tasks are excluded the archive does not contain tasks.json.
  2. Keep the file somewhere that is not DMH.
  3. 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.
  • Current exports use manifest version 2 and preserve every supported task type, public/icon/participant configuration, task parent/previous links, subtask configuration, ordering, and previous-subtask links. Older version 1 archives remain readable.
  • Owner IDs, active/completed state, ping secrets, execution history, shares, participants, and other runtime/security state are never restored.
  • Unsupported or malformed records are skipped rather than changed into a Reminder. The import result tells you how many were created/skipped and shows warnings describing what was omitted. The whole accepted batch is transactional, so a database failure creates none of it.
  • 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

ErrorWhereCauseSolution
"Tier limit reached"Creating/activating a taskFree tier max 3 active watchdog tasksDeactivate a task or upgrade tier
"Contact limit reached"Sending contact requestFree tier max 1 contactRemove a contact or upgrade
"Sharing limit reached"Sharing a taskFree tier max 1 shared userRemove a share or upgrade
"Email not verified"Accessing chat, sharingAccount email not confirmedCheck inbox for verification link, or click "Resend"
"Task not found"UI actionTask was deleted, or you don't own itCheck task ownership; refresh the page
"Rate limit exceeded"Search, login, registerToo many requests in a short windowWait and retry (see limits below)
"SMTP connection refused"Watchdog email subtaskEmail server unreachableCheck recipient email; retry later
"Webhook failed"API Trigger subtaskTarget URL unreachable or returned errorVerify the webhook URL in the subtask
"Failed after 3 attempts"Task goes to Failed statusAll subtask execution retries exhaustedFix root cause, deactivate, re-run (see 4.9)
"Value must be <timestamp> or later" or "watchdog must start at least N minutes from now"Creating a watchdogStart 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"RegistrationPassword doesn't meet requirementsUse min 8 chars with uppercase, lowercase, and digit
"Session expired"Any authenticated actionAccess token expired and refresh failedLog in again

Rate Limits

ActionLimit
Login5 attempts / minute
Registration3 attempts / minute
User search10 / 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"

  1. Check your internet connection.
  2. Try a hard refresh (Ctrl+Shift+R / Cmd+Shift+R).
  3. Clear browser cache for the site.
  4. Try a different browser.
  5. Check if the service is down (visit the landing page).

"Everything broke after an update"

  1. Hard refresh the page (Ctrl+Shift+R).
  2. Clear site data (cookies + cache).
  3. Uninstall and reinstall the PWA.
  4. Log out and log in again.

"My data disappeared"

  1. Check that you're logged into the correct account (email vs. OAuth).
  2. Check the status filter on the Dashboard — you might be filtering out your tasks.
  3. Local-only reminders (offline) are tied to the device/browser. Clearing browser data removes them.
  4. Server tasks are never lost — if they don't appear, try refreshing or logging out/in.

"Timer shows wrong time"

  1. Go to Settings → Timezone and verify it matches your actual location.
  2. The app uses server time for synchronization. Check that your device clock is reasonably accurate.
  3. Refresh the page to re-sync the time offset from the server.

"Chat not accessible"

  1. Verify your email address is confirmed (check for verification link in inbox).
  2. Chat requires a verified email. Go to Settings → "Resend verification email" if needed.

"Hit a tier limit"

  1. A modal will display your current tier and upgrade options.
  2. Upgrade your tier to unlock more capacity.

9. Advanced Usage

Complex Subtask Chains

For advanced Watchdog setups, chain multiple subtasks in the task editor:

  1. Sequential chain: Email → SMS → Telegram

    • Subtasks run one after another in the order you added them.
  2. Parallel chain: Send Email + SMS + Telegram all at once.

    • Fastest delivery; all subtasks start simultaneously.

There is no BLOCKING link type. Use a Cooperative Run the subtask chain confirmation action when execution must wait for two authorised people.


Document History

VersionDateChanges
2.52026-08-20Synced public challenge lifecycle, anonymous/flagged payments, Serializable cooperative dispatch, and manifest-v2 backup import/export behavior.
2.42026-06-07Auth/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.32026-05-18Code 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.22026-05-05Removed 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.12026-04-28Remember Me login (30-day vs 24-hour sessions); refresh token reuse detection; theme labels Green/Violet; feed localization note
2.02026-04-03Full rewrite: added scenarios, decision trees, error handling, FAQ, glossary, advanced usage
1.02026-03-01Initial guide

Your Digital Failsafe — Dead Man's Hand