Next meetings
Upcoming meetings and open action items from past ones
Weekly goal
What are the 1–3 things that count this week? Don't forget to save.
Applies to the current calendar week (Mon–Sun) and is stored per week.
New messages
Unread messages to you
Due & overdue
Important + urgent from your ranking
Team progress
Completed todos per team member
Top ranking
Your most important open todos (manual ranking)
Social media speed-check
Metrics from the Social Media Dashboard
Todo ranking
Drag entries into your preferred order – the order is saved.
Eisenhower matrix
Quadrant via “Important” and “Urgent” – “Automatic” derives it from the due date. Drag todos into a quadrant or click them to assign.
Notes & Plans
Notes, plans, checklists – saved automatically.
New note
Title, type and content – that's all you need.
Markdown: # title, ## section, - list, **bold**, `code`
Projects
Todos
Todos assigned to this project – tick them off here or open them in the todo list.
Discussion
Opinions and feedback on the project as a whole.
Images
Activity
Trend
–
Distribution by platform
–
Platforms
–
Company structure
+ insert below a node · ✎ rename · ✕ remove (incl. sub-structure) – changes are saved automatically.
Team
Company timeline
What happened when – including the events that moved us forward.
Availability
Who is available when – everyone sees all users' calendars.
Meeting planner
Pick a date and time – you instantly see who has time.
Current issues & constraints
What is currently stuck or blocked – visible to everyone.
All team meetings
Plan meetings and keep transcripts, summaries and action items in one place.
Tip: drop transcript files anywhere on this page. A date in the file name (e.g.
2026-10-31) sets the meeting date.Shared data (server)
All dashboard data (todos, messages, projects, notes …) is stored centrally on seiler-siebert.info, so everyone sees the same state on every computer. Changes are uploaded right away; changes by others appear within a few seconds.
–
Data
The master copy lives on the server; this browser keeps a local copy. Export a backup regularly.
–
Access
Every user signs in with their own name and password. A new name – or the first sign-in of a user without a password – additionally needs the team access code once.
–
Passwords
Changing a password immediately ends that user's other sessions.
Users
Users are stored permanently and can be renamed at any time.
| Name | ID |
|---|
Backup & Restore
Download the full state — projects, todos, notes, messages, users, availability and more — as a JSON file. On a new/different computer you can restore it here and keep all your data.
Choose a file you saved earlier. The restore merges the data (newer items keep their ids).
Reset
Deletes data irreversibly – for everyone, because the data is shared. Users and passwords are kept.
Extra backup on your own webhost (optional)
Keep a master copy of all data on your webhost so nothing can vanish. Create save.php on the server (code in Settings → Data sources) and enter its URL here. The dashboard then uploads automatically after every change.
Extra backup off.
Data sources
Social media numbers are read live from the Social Media Dashboard's storage
(
ss_social_dashboard_v1) – both dashboards share the same data as soon as they are open in the same browser.
Notes, messages and the company structure are maintained here and stored on the server.
Server receiver (save.php – copy to your webhost, set your own key)
<?php
// save.php – dashboard data backup receiver
// 1. Set the same key you enter in the dashboard under “Backup key”
$KEY = 'CHANGE-ME';
// 2. Upload this file as save.php to your webhost.
// Data is written next to it as dashboard-data.json (auto-incrementing backups in data-backups/).
header('Access-Control-Allow-Origin: *');
$file = __DIR__ . '/dashboard-data.json';
$backupDir = __DIR__ . '/data-backups';
$givenKey = $_SERVER['HTTP_X_BACKUP_KEY'] ?? '';
if ($givenKey !== $KEY) { http_response_code(403); header('Content-Type: application/json'); echo '{"error":"wrong key"}'; exit; }
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$body = file_get_contents('php://input');
$decoded = json_decode($body);
if ($decoded === null) { http_response_code(400); header('Content-Type: application/json'); echo '{"error":"invalid JSON"}'; exit; }
if (strlen($body) > 30 * 1024 * 1024) { http_response_code(413); header('Content-Type: application/json'); echo '{"error":"too large"}'; exit; }
if (!is_dir($backupDir)) { @mkdir($backupDir, 0755, true); }
if (is_file($file)) { @copy($file, $backupDir . '/dashboard-' . date('Ymd-His') . '.json'); }
if (file_put_contents($file . '.tmp', $body) === false
|| !rename($file . '.tmp', $file)) {
http_response_code(500); header('Content-Type: application/json'); echo '{"error":"write failed"}'; exit;
}
$n = 0;
foreach (glob($backupDir . '/dashboard-*.json') ?: [] as $f) { $n++; }
if ($n > 20) {
$files = glob($backupDir . '/dashboard-*.json');
usort($files, fn($a, $b) => filemtime($a) <=> filemtime($b));
foreach (array_slice($files, 0, $n - 20) as $old) { @unlink($old); }
}
header('Content-Type: application/json');
echo '{"ok":true,"bytes":' . strlen($body) . '}' ;
exit;
}
header('Content-Type: application/json');
if (is_file($file)) { header('ETag: "' . md5_file($file) . '"'); readfile($file); }
else { http_response_code(404); echo '{"error":"no backup yet"}'; }
?>