DMH — User Guide
Version 2.8 | Updated: 2026-10-22 | App version: 0.2.x
Version 2.8 | Updated: 2026-10-22 | 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 Private Challenge | 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 task type with check-ins by a deadline — public (others can join, with a leaderboard) or private (for yourself, or assigned to another user) |
| Publication | A task type that publishes its message to the Feed when its timer ends |
| Healthcheck | A task type that checks something on a schedule and raises the alarm only when the check fails |
| 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 for an Active Watchdog, opened with the card's Force button |
| 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" | Private Challenge with ASSIGNEE/WATCHER sharing |
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.
Sign up — Go to the homepage and click "Sign in", then "Sign up" at the bottom of the login card. Or sign in straight away with GitHub / Google on the same card.
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, press the round + button in the bottom-right corner. A full-screen wizard opens with the same steps as the task editor, one screen each. Nothing is saved until its last step, and closing it (✕ or Esc) throws the draft away — after asking, if you typed anything.
Step 1 — "Template": pick the "Watchdog" card, then click "Next".
Step 2 — "Basics":
Step 3 — "Timing":
firstWarning + 1 minutes from now (6 minutes by default, configurable in Settings → Watchdog Warning Periods)Step 4 — "Advanced settings": under "Task Chain (Payload)", choose "Email" in the subtask type list and click "Add subtask", then enter a recipient email, subject and content. (The email body lives in the subtask, not in the Notification text.)
Activate — Click "Create and run". ("Create task" stores it Inactive instead; you start it later with "Run" in its editor.)
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 | Check-ins by a deadline — public (others join, leaderboard) or private (yours, or assigned to another user) | Each check-in time arrives; a missed deadline fails it | Optional: repeat interval |
| Publication | Posts its message to the public Feed | Timer reaches 0 | No (one-shot) |
| Healthcheck | Watches a device or a URL and alerts only on failure | A check fails | Yes (keeps checking) |
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 or parallel │
│ 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). The time picker's minimum shows this floor, and Run (in the wizard: "Create and run") enforces it. Save ("Create task") does not: it stores the task as an Inactive draft, which never fires, so an earlier or even past time is kept until you press Run.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 |
|---|---|---|
| Save or Run answers "watchdog requires at least one valid subtask" | No subtask, or a subtask with an empty required field | 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 |
| Run asks "Maybe the time is out of date?" | Start time is below firstWarning + 1 minutes from now (6 min by default; rises if you raised the "first warning" period in Settings). Save accepted it because a saved draft is Inactive; Run is where the floor applies | Accept the suggested time (the task stays Inactive), then press Run again — or 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.
Leitner format. The task does not move on by itself. When a review is due, the task card asks "Time to review. How did it go?" and shows three buttons, each labelled with the interval it leads to:
| Button | What happens |
|---|---|
| Remembered | The next, longer interval. Remembered after the 180-day interval, the task completes. |
| Needed a hint | The same interval again. |
| Forgot | One interval back, never shorter than 1 day. |
The next review is counted from the moment you rate. Show what to memorize reveals the Content to memorize, so you can try to recall it first. Until you rate a due review, the reminder rings again every day. Rating needs an internet connection.
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). Case does not matter and the #number is optional, but a partial tag finds nobody.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 or partial search tag — only the whole tag matches | Ask them for their exact search tag (Settings → Search Tag) |
| "Contact limit reached" | Free tier: 1 contact | Upgrade tier or remove an existing contact |
| Search shows nothing at all | Fewer than 3 characters, or only part of the tag typed | Type the whole tag; there is no "no results" message |
| 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: one of its actions failed all of its attempts (3 by default; an API Trigger uses its own retry count). The task fails as soon as that action has used up its attempts — the action is not sent another round.
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 — reopen first | Click "Reopen", 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:
/report and pressing Enter opens Report to Admin; /backup opens Backup & Export.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. Must be at least firstWarning + 1 minutes from now (6 min by default; configurable in Settings → Watchdog Warning Periods) when you press Run. The time picker's minimum shows the same floor. Save keeps any time, because a saved Watchdog is an Inactive draft and never fires. |
| Subtasks | Yes (at least one) | Action chain: Email, SMS, Telegram, API Trigger, SSH commands, Home Assistant. Activating a Watchdog with no valid subtask is blocked with "watchdog requires at least one valid subtask". Existing legacy PUBLISH_INFO entries send press email only and never create Feed content. |
Behavior on expiry:
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 |
| Leitner | 1 → 3 → 7 → 14 → 30 → 90 → 180 days, moved by your rating | ~325 days if you remember every time |
Parameters:
| Parameter | Required | Description |
|---|---|---|
| Format | Yes | Multi-Day, Intra-Day or Leitner |
| 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.
Leitner rating: When a Leitner review is due, the card shows three buttons in place of the postpone button: Forgot (one interval back), Needed a hint (the same interval) and Remembered (the next interval), each labelled with the interval it leads to. The next review is counted from your rating, and an unrated review rings again every day. See 4.4.
Completion: After the last interval, the task automatically marks as Completed. A Leitner task completes when you rate Remembered after the 180-day interval.
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 Challenge that is not listed publicly — for yourself, or assigned to another user whose completion you monitor. The wizard has no separate "Personal Report" type any more; older Personal Report tasks became private Challenges.
When to use: Medication intake, delegating work, accountability partnerships.
How to create: set the Dashboard type filter to Challenge. The bar that appears there has a checkbox that reads "Public — listed publicly with a leaderboard" or "Private — visible only to people you share it with"; switch it to Private, then create the task (type a name and press Enter). The timing step asks for "Complete by", and optionally "Repeat interval (hours)" and "Repeat until (optional)".
Assigning it to someone: open Chat with a contact → "Share a Task" → pick the task → "Share as:" "Watcher" or "Assignee".
Roles:
| Role | Can view | Can change status | Can comment |
|---|---|---|---|
| WATCHER | Yes | No | Yes |
| ASSIGNEE | Yes | Yes (Activate / confirm) | Yes |
Deadline: a private challenge must be confirmed before its deadline, otherwise it fails and watchers are alerted (see 5.22).
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 and body (no file attachments) | recipientEmail, subject, content | |
| 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 (legacy) | Bulk email to a list of addresses; never writes Feed | journalistEmails[], subject, content |
| SSH commands | Run commands on a remote server over SSH | host, port, username, credentials, commands |
Link types control execution order:
| Link Type | Behavior |
|---|---|
| Sequential | Subtasks run one after another, in order. The next subtask starts only after the previous one finished (success or final failure). |
| Parallel | Consecutive PARALLEL subtasks run simultaneously as one batch. One subtask's failure does not abort siblings in the same batch. |
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 last-chance countdown for an Active Watchdog. It opens only when you press the red Force button on the task card — it does not appear by itself at the deadline; a Watchdog that reaches its deadline simply fires (see 5.2).
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:
Language. Notification text arrives in English by default, even when the rest of the app is in another language — iPhones read notifications aloud with Siri, and Siri only pronounces English clearly. To have notifications follow your interface language instead, untick Send notifications in English under Notification language.
Night notifications. Untick Settings → Interface → Show notifications at night and DMH holds back push notifications between 22:00 and 09:00. Held means not sent — they are not delivered later in the morning. "Night" is read on your Settings → Profile → Timezone; left on Default, that is the timezone of the device you last opened DMH on. The only pushes that still come through are Device alarm actions (the challenge action that rings a paired phone or ESP32 loudly). Everything else is held, including reminder alarms and watchdog warnings — keep the box ticked if a watchdog may run out overnight.
Finding users:
#number optional, but Joh will not find JohnDoe#48293. This is deliberate — a tag works like an address you were given, not a directory anyone can browse.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 |
An ASSIGNEE can Activate a stopped task but cannot change its timing, so Activate appears only once the owner has given the task a start time (a challenge's schedule counts as one). A WATCHER sees no Activate, Deactivate or Reopen; on a challenge the watcher edits the schedule and can reopen it once it has finished, but never starts or stops it.
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:
Top Challenges: above the tabs, a horizontal strip ranks public challenges (#1, #2, …) and shows each one's participant count, completion count and completion rate. This strip is the challenge leaderboard; clicking a card opens that challenge's detail page.
Actions:
Joining is not a feed action: it happens on the challenge detail page.
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}), opened from a Top Challenges card:
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 |
| Notification language | Whether push notifications follow your interface language or stay in English; see Notification language. | Off — notifications in English |
| Night notifications | Unticked, no push notifications between 22:00 and 09:00 in your timezone (Default = this device's). Only Device alarm actions still come through; see Notifications. | On — notifications at any hour |
| Date format | How 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 format | 24-hour or 12-hour clock. | Match my language |
| Forced Start Delay | Countdown on the Forced Start page (opened with Force) before the 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 |
| Tasks about to start on top | Running tasks that start within 2 minutes — or started less than 2 minutes ago and are still running — show above everything else, including pinned tasks and the task you are editing, whatever filter or search is on. Healthchecks are not lifted. Saved per device. | On |
| 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. Adding one asks for a 6-digit code we email you first (valid 10 minutes, 5 tries), and every new passkey is announced by email: a passkey signs in without your password, so adding one must take more than an open session. | 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 |
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 format | Example | When to pick it |
|---|---|---|
| Match my language (default) | 5/9/2026 in English, 09.05.2026 in Ukrainian | You 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 first | 9 May 2026 | The order most of the world reads, with the month spelled out. |
| Month first | May 9, 2026 | The order common in the United States, with the month spelled out. |
| Year-month-day (ISO) | 2026-05-09 | The 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 format | Example |
|---|---|
| Match my language (default) | Whatever your language normally uses |
| 24-hour | 14:42 |
| 12-hour | 02:42 PM |
Two details worth knowing.
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.
Notifications are a separate language choice from the interface, under Settings → Interface → Notification language. By default they arrive in English no matter what language the rest of the app is in.
Why they are not simply in your language. iPhones can read incoming notifications out loud — Settings → Notifications → Announce Notifications, which most people meet through AirPods or CarPlay. The voice doing the reading is Siri, and Siri pronounces English clearly and very little else. A Ukrainian or Japanese notification body is skipped or mangled, so the one moment where a notification matters most — your hands are busy and you are not looking at the screen — is the moment it stops being understandable. English keeps it spoken.
Send notifications in English is ticked from the start. Untick it and notifications follow your interface language instead. Pick that if you read your notifications rather than hear them.
| The tick | What arrives |
|---|---|
| On (default) | Every notification in English, whatever the interface language is. Spoken announcements stay intelligible. |
| Off | Notifications in your interface language, same as the rest of the app. |
Details worth knowing.
| Tier | Price | Active Watchdogs | Total Tasks | Contacts | Sharing | Chat |
|---|---|---|---|---|---|---|
| Free | $0 | 3 | 999 | 1 | 1 user | No |
| Tier 1 | $1 | 10 | 999 | — | — | — |
| Tier 2 | $20 | 20 | 999 | — | — | — |
| Tier 3 | $300 | 30 | 999 | — | — | — |
| Tier 4+ | $100/tier | +10 per tier | 999 | — | — | — |
"—" = details TBD for paid tiers.
Global safety caps — every tier, free or paid: 999 tasks owned in total, and 99 tasks Active at once. Unlike the per-tier Active Watchdogs column, these two ceilings span all task types and are not raised by upgrading.
When you hit a limit:
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.
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 interface language and timezone:
| You | Methods shown |
|---|---|
Interface language is Ukrainian, or the timezone (Settings) is Kyiv — Europe/Kyiv or the older spelling Europe/Kiev | Monobank (card via Monobank Jar) and Crypto |
| Everyone else | Stripe Checkout when the operator has explicitly enabled it, plus Crypto |
Either signal is enough, so a Ukrainian interface abroad and an English interface in Kyiv both see Monobank. To change the set, change the language or the timezone; there is no switch on this screen.
The BTC address is shown in full and wraps on narrow screens. Tap it once to select the whole address, or use the copy button next to it.
"Keep DMH running?" — a one-time dialog on the dashboard, offered from your second time opening the app. Support DMH takes you to this page; Not now (or Escape) closes it. Either answer retires it for good, on every device — it is never shown again, and no feature depends on your choice.
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.
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 and a special character such as ! @ # $ % - _) | 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:
Forgotten password:
/forgot-password, which says so.Staying logged in:
Multiple devices:
Sessions (under the hood):
What it does: Turns a Challenge into a recurring habit tracker. You declare when a check-in is due; DMH reminds you, waits for your confirmation, and records a green/red day on a calendar. Optionally, you also declare what counts as done — a checklist that must be fully ticked before the confirmation is accepted.
When to use: Daily habits (brushing, exercise, medication), multi-step routines you keep half-finishing, and anything an accountability partner should be able to see the history of.
Where: Create a task, pick the Challenge template, then open step 3 (Timing) of the editor. The check-in calendar itself appears on the task card once the challenge is running.
Schedule parameters:
| Parameter | Required | Description |
|---|---|---|
| Complete by | Yes | Wall-clock time of the check-in, e.g. 08:00. Interpreted in the schedule's timezone, so it stays at 08:00 across DST changes. |
| Repeat interval (hours) | Yes | How often the check-in comes back. 24 = once a day; 8 = three times a day. |
| Repeat until | No | Last day of the course, inclusive. The challenge deactivates itself the following day. Empty = runs indefinitely. |
| First reminder | No | Minutes before the deadline for the first nudge. Default 5. When no ASSIGNEE is assigned, this remains when the check-in action becomes available to the owner or eligible WATCHER. A scheduled ASSIGNEE can use the current schedule-day checklist immediately; reminders are nudges and do not unlock their flow. |
| Second reminder | No | Minutes before the deadline for the final nudge. Default 2. Must be smaller than the first. |
| Completion checklist | No | Up to 20 mandatory items. Empty = confirm with a single tap. |
Completion checklist — the confirm gate:
2 of 3 completed). Once accepted, that occurrence has one successful result.Nuances worth knowing:
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.
What it does: The inverse of the Watchdog. Instead of waiting for you to feed it, a Healthcheck actively goes and looks at something on a schedule, and raises the alarm only when the check fails. Silence means everything is fine.
When to use: Websites and APIs that must stay up, nightly backups and cron jobs that must keep reporting in, and physical spaces watched by a paired motion sensor.
Modes:
| Mode | What it watches | Failure means |
|---|---|---|
| URL | A public HTTPS endpoint you supply. DMH sends a request and compares the status code (and optionally the body) against what you declared. | The probe did not return what you expect — after a 3-attempt retry cycle. |
| Device | A paired ESP32 motion sensor. | Alarm off: no motion within the interval — the thing that should be moving stopped. Alarm on: motion was seen — silence was the goal, so movement is the intrusion. |
Parameters:
| Parameter | Required | Description |
|---|---|---|
| Target URL | URL mode | Must be a public address. Private/internal addresses are refused (SSRF protection). |
| Expected status | No | Defaults to any 2xx. |
| Expected body contains | No | Substring the response must contain. Useful for "db":"connected"-style health payloads. |
| Interval | Yes | How often the check runs / how long silence is tolerated. |
| Alarm mode (device) | No | Inverts what motion means, as above. |
What happens on failure: one push notification, plus the task's whole subtask chain — Telegram, email, an API call, an SSH command, whatever you attached (see 5.8 Subtasks). A Healthcheck reports only on failure, so the trigger journal on the task card is the record you pull to see what has been happening: every probe result, motion event, and external ping, with its outcome.
Nuances worth knowing:
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
B — Dual confirmation (the two-man rule)
Nuances worth knowing:
What it does: Lets machines, not just people, feed a task. Any Watchdog or Healthcheck can expose a public ping URL; anything that can make an HTTP request can re-arm it.
When to use: Nightly backups, cron jobs, CI pipelines, IoT devices — anything that should happen on a schedule, where silence past the deadline is the failure you want to hear about.
How:
Open the task and enable its ping URL. The task card shows the full address, and it stays re-displayable — you can copy it again later.
Append the call to the end of the job:
0 3 * * * /opt/backup.sh && curl -fsS "https://dmh.syntrope.app/api/checks/<key>/ping"
Every successful ping pushes the deadline forward. A missed ping means the job did not finish, and DMH alerts you.
Nuances worth knowing:
PING_RECEIVED.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 — there is no sidebar link: type /backup in the dashboard search bar and press Enter, or open the URL directly.
How:
tasks.json.Nuances worth knowing:
What it does: Publishes a message to the public Feed when its timer ends.
How to create: Dashboard → press + (bottom-right) → on the "Template" step pick "Publication".
Parameters:
| Parameter | Step | Required | Description |
|---|---|---|---|
| Title | Basics | Yes | Becomes the feed title |
| Start Time | Timing | Yes | "In 5 minutes", "In 15 minutes", "In 30 minutes", or "Custom period" |
| Message | Advanced settings → "Publication content" | To run — a draft saves without it | The text that gets published. Run is refused while it is empty, so the "Notification text" never goes to the feed in its place |
| Image URL (optional) | Advanced settings → "Publication content" | No | Picture shown with the post |
A Publication has no postpone period. "Save" (in the wizard: "Create task") only stores it as an Inactive draft — nothing is scheduled. The timer starts with "Run" ("Create and run"), and that is when the "Publication scheduled" notice appears. When the timer ends the post goes to moderation first; track it under "My publications" on the Feed.
What it does: Sends a bug report, feature request or other feedback to the site owner. The message is emailed to the owner and saved, so it can be reviewed and answered later.
Access: /report — requires login. There is no sidebar link: type /report in the dashboard search bar and press Enter, or open the URL directly. The password-reset page (/forgot-password) does not link here — whoever opens it is not logged in — its "Contact admin" button opens an email to the owner instead (see §5.21).
Fields: Subject (up to 120 characters) and Message (up to 4000 characters), then "Send to admin". Your user id and email are attached automatically so the owner can reply. A confirmation ("Report sent. Thank you!") appears when it goes through.
Limit: 3 reports per minute.
| 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: action N (type) did not succeed" | Task goes to Failed status | That action's retries are exhausted | Fix the named action, reopen, re-run (see 4.9) |
| "Value must be <timestamp> or later" or "watchdog must start at least N minutes from now" | Running 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, digit and a special character such as ! @ # $ % - _ |
| "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: I forgot my password. How do I reset it? A: There is no self-service reset yet. If you signed up with Google or GitHub, sign in with that provider. Otherwise click "Forgot password?" on the login screen, then "Contact admin": it opens an email to the site owner — send it from the address you registered with. See 5.21.
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: No. The Email subtask sends a recipient, a subject and a text body; the form has no file attachment. Put a link to the file in the email text instead.
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.
Q: Why doesn't my Leitner task move to the next interval? A: A Leitner task moves only when you rate a due review on its task card (Remembered, Needed a hint or Forgot). Until you rate it, the reminder rings again every day. Rating needs an internet connection.
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 → A watchdog fires on its own at the deadline; the
│ │ Forced Start countdown only runs after you press Force
│ └─ 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 it between 22:00 and 09:00 your time?
│ ├─ Yes → Check Settings → Interface → "Show notifications at night".
│ │ Unticked, DMH sends nothing at night (Device alarms excepted).
│ └─ No ↓
│
├─ 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.
There is no BLOCKING link type. Use a Cooperative Run the subtask chain
confirmation action when execution must wait for two authorised people.
| Version | Date | Changes |
|---|---|---|
| 2.8 | 2026-10-22 | §6 "Invalid password" now names the special-character rule, matching §5.21 and the registration form (manual QA 2026-10-22). |
| 2.7 | 2026-10-11 | Sign-in sync after manual QA (2026-10-11): §2 step 1 — the homepage button is Sign in (then Sign up on the login card), there is no "Get Started"; §5.21 — registration also requires a special character, and a new "Forgotten password" block (no self-service reset; login links to /forgot-password, whose Contact admin now opens an email); §5.28 — /forgot-password no longer points to /report, which needs a session. |
| 2.6 | 2026-10-07 | Watchdog sync after manual QA (2026-10-06): the Email subtask has no file attachment (removed from the form in 2026-03 with the subtask chain); the Blocking link type is gone (removed 2026-06-01 — the backend never accepted it); the start-time floor is enforced on Run, not on Save (a saved Watchdog is an Inactive draft); the button is Save, not "Create". |
| 2.5 | 2026-08-20 | Synced public challenge lifecycle, anonymous/flagged payments, Serializable cooperative dispatch, and manifest-v2 backup import/export behavior. |
| 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