DMH — User Guide
Version 2.4 | Updated: 2026-06-07 | App version: 0.2.x
Version 2.4 | Updated: 2026-06-07 | App version: 0.2.x
| 5.16 Feed |
| Task didn't fire |
| What it solves | Subtasks | Spaced Rep | 5.5 Spaced Rep | 5.17 Settings | No notifications |
| NOT included | Contacts | Challenge | 5.6 Challenge | 5.18 Tiers | Common Problems |
| 2. Quick Start | Tiers | Sharing | 5.7 Report | 5.19 Donations | 9. Advanced |
| Postponing | 5.8 Subtasks | 5.20 PWA | Subtask Chains |
| Add Contact | 5.9 Postpone | 5.21 Auth |
| Failed Task | 5.10 Forced Start |
| Offline | 5.11 Notifications |
| 5.12 Contacts |
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 |
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.
| 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 |
Goal: Create your first watchdog timer and see it in action.
Time required: ~3 minutes.
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:
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.
A task is the core entity in DMH. Every task has:
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:
Automatic transitions:
| 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 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) │
│ │
└───────────────────────────────────────┘
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.
DMH uses a freemium model. Free users can create up to 3 active watchdog tasks and have 1 contact. Paid tiers unlock more capacity.
Each scenario follows this template: When to use → Preconditions → Steps → Expected result → Possible problems.
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:
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.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 |
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:
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:
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 |
When to use: You want to alternate between focused work periods and breaks.
Preconditions: Logged in.
Steps:
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 |
When to use: You're memorizing content (vocabulary, formulas, etc.) and want increasing intervals between reviews.
Preconditions: Logged in.
Steps:
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 |
When to use: You want to create a public competition that other users can join.
Preconditions: Logged in. Email verified.
Steps:
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 |
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:
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:
| Problem | Cause | Solution |
|---|---|---|
| "Share" option not visible | No accepted contacts | Add a contact first (see 4.8) |
| "Sharing limit reached" | Free tier: 1 unique shared user | Upgrade tier or remove existing shares |
| Shared user can't edit | They have WATCHER role | Change their role to ASSIGNEE |
When to use: Your watchdog timer is counting down and you want to extend the deadline.
Preconditions: Task is in Active status.
Steps:
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 |
When to use: You want to share tasks, chat, or collaborate with someone.
Preconditions: Both users logged in. Both have verified emails.
Steps:
JohnDoe#48293). Minimum 3 characters.Expected result: Once accepted, the contact appears in your contacts list. You can now share tasks, start chats, and collaborate.
Contact states:
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) |
When to use: A watchdog task shows Failed status after 3 retry attempts.
Preconditions: Task is in Failed (5) status.
Steps:
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 |
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:
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 |
The Dashboard (/dashboard) is the main workspace.
Components:
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.
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, Publish Info, SSH commands. Activating a Watchdog with no valid subtask is blocked with "watchdog requires at least one valid subtask". |
Behavior on expiry:
Warnings:
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:
| Parameter | Required | Description |
|---|---|---|
| Title | Yes | Alarm name |
| Repeat | Yes | None, Daily, Monthly, Yearly |
| Weekdays | Only for Daily | Which days to fire (Mon–Sun, all selected by default) |
| Sound | No | Enable/disable notification sound |
| Start At | Yes | First fire time |
Repeat behavior:
| Repeat | After trigger... |
|---|---|
| None | Task marks as Completed |
| Daily | Reschedules to the next matching weekday at the same time |
| Monthly | Reschedules to the same date next month |
| Yearly | Reschedules 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.
What it does: Cycles through work and break periods for focused productivity.
When to use: Study sessions, deep work, creative tasks.
Parameters:
| Parameter | Default | Description |
|---|---|---|
| Work duration | 25 min | How long each work session lasts |
| Break duration | 5 min | Short break between sessions |
| Long break duration | 15 min | Break after N sessions |
| Sessions before long break | 4 | How many work sessions before a long break |
| Working period start | 09:00 | Auto-pause before this hour |
| Working period end | 18:00 | Auto-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:
Stopping: Click "Stop Pomodoro" on the task card. The task deactivates and preserves session state.
What it does: Schedules reviews at scientifically-proven expanding intervals to optimize memorization.
When to use: Language learning, exam prep, memorizing any content.
Formats:
| Format | Intervals | Total duration |
|---|---|---|
| Multi-Day | 1 → 3 → 7 → 14 → 30 → 60 → 120 days | ~235 days |
| Intra-Day | 5 → 15 → 30 → 60 → 120 → 240 minutes | ~7.8 hours |
Parameters:
| Parameter | Required | Description |
|---|---|---|
| Format | Yes | Multi-Day or Intra-Day |
| Content to memorize | No | Text content for review (shown on task card) |
| Start At | Yes | First 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.
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:
| Parameter | Required | Description |
|---|---|---|
| Title | Yes | Challenge name |
| Content | Yes | Rules and description |
| Max Participants | No | Limit on participants (empty = unlimited) |
Lifecycle:
Accessible at: /challenges/{id} for detailed stats, participants, and reports.
What it does: A private task shared between you and another user for collaboration.
When to use: Delegating work, accountability partnerships, private reporting.
Parameters:
| Parameter | Required | Description |
|---|---|---|
| Title | Yes | Task name |
| Content | Yes | Description |
| Shared with | Yes | Contact to share with |
| Role | Yes | ASSIGNEE or WATCHER |
Roles:
| Role | Can view | Can change status | Can comment |
|---|---|---|---|
| WATCHER | Yes | No | Yes |
| ASSIGNEE | Yes | Yes (Complete/Fail) | Yes |
Not visible on the public feed. Only the owner and shared users can see it.
Subtasks are actions attached to a Watchdog task. When the timer expires, subtasks execute in a defined order.
Subtask types:
| Type | Description | Configuration |
|---|---|---|
| Send email with subject, body, optional attachments | recipientEmail, subject, content, archiveFile | |
| SMS | Send SMS message | phoneNumber, message |
| Telegram | Send Telegram message | botToken (or use DMH bot), chatId, message, parseMode |
| API Trigger | HTTP request to an external webhook | webhookUrl, method (POST/GET/PUT/DELETE), headers, body, retryAttempts |
| Publish Info | Bulk email to a list of addresses | 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:
Configuring SSH commands:
22). Localhost, private network addresses, Docker service names, and cloud metadata hosts are blocked.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.
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.
What it does: A full-screen countdown page that appears when a Watchdog task reaches its deadline.
Access: /dashboard/forced-start/{task-id}
Elements:
Behavior:
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:
Finding users:
Search Tag format: Name#12345 — a unique identifier visible in each user's Settings.
Contact request flow:
Rate limits:
Free tier limit: Maximum 1 accepted contact.
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:
Free tier: Share with up to 1 unique user total.
Type: Real-time messaging via WebSocket (Socket.IO).
Features:
PENDING status and becomes ACTIVE only after the invited contact accepts. Individual messages are not pre-moderated.Requirement: Verified email address.
Access: /chat
Tabs:
What it does: A feed of public content organised into two tabs.
Access: /feed — no login required to view.
Tabs:
Actions:
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.
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 |
| Tier | Price | Active Watchdogs | Total Tasks | Contacts | Sharing | Chat |
|---|---|---|---|---|---|---|
| Free | $0 | 3 | 1,000 | 1 | 1 user | No |
| Tier 1 | $1 | 10 | — | — | — | — |
| Tier 2 | $20 | 20 | — | — | — | — |
| Tier 3 | $300 | 30 | — | — | — | — |
| Tier 4+ | $100/tier | +10 per tier | — | — | — | — |
"—" = details TBD for paid tiers.
When you hit a limit:
Important: Unverified accounts (no confirmed email) are limited to free-tier features only, regardless of payment status.
Reminders (local) are unlimited — they are stored on your device and do not count toward server task limits.
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.
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 |
What works offline:
What requires connectivity:
Methods:
| Method | How | Details |
|---|---|---|
| Email & Password | 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:
Staying logged in:
Multiple devices:
Sessions (under the hood):
| 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" |
| "Task not found" | UI action | Task was deleted, or you don't own it | Check task ownership; refresh the page |
| "Rate limit exceeded" | Search, login, register | Too many requests in a short window | Wait and retry (see limits below) |
| "SMTP connection refused" | Watchdog email subtask | Email server unreachable | Check recipient email; retry later |
| "Webhook failed" | API Trigger subtask | Target URL unreachable or returned error | Verify the webhook URL in the subtask |
| "Failed after 3 attempts" | Task goes to Failed status | All subtask execution retries exhausted | Fix 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 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 |
| Action | Limit |
|---|---|
| Login | 5 attempts / minute |
| Registration | 3 attempts / minute |
| User search | 10 / 60 seconds |
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.
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
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
"Nothing works — page won't load"
"Everything broke after an update"
"My data disappeared"
"Timer shows wrong time"
"Chat not accessible"
"Hit a tier limit"
For advanced Watchdog setups, chain multiple subtasks in the task editor:
Sequential chain: Email → SMS → Telegram
Parallel chain: Send Email + SMS + Telegram all at once.
Blocking chain: Email → BLOCKING → next subtask
| 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 |
| 2.0 | 2026-04-03 | Full rewrite: added scenarios, decision trees, error handling, FAQ, glossary, advanced usage |
| 1.0 | 2026-03-01 | Initial guide |
Your Digital Failsafe — Dead Man's Hand