Dashboard Sync (GitHub to Obsidian)¶
The dashboard sync pulls GitHub issues across your repositories into Obsidian as kanban boards, individual issue notes, and a Dataview dashboard. It runs on the host (not inside the VM) and writes directly to your Obsidian vault.
What It Creates¶
After a sync, your vault will contain:
<vault>/
Engineering/
Master Kanban.md # All issues across all repos, grouped by state
<owner>-<repo> Kanban.md # Per-repo board (one per repo with issues)
Issues/
<owner>-<repo>/
<number>-<slug>.md # Individual issue note with YAML frontmatter
Dashboard.md # Dataview-powered summary table
Each issue note includes frontmatter with repo, number, state, labels, assignees, created, and updated fields. The kanban boards use Obsidian's native kanban plugin format.
Prerequisites¶
- An Obsidian vault on the host filesystem
- The sync script at
<vault>/_scripts/gh-obsidian-sync.py(or a custom path) ghCLI authenticated (the script callsgh issue listandgh api)- Python 3.11+ on the host
Configuration¶
Add a [dashboard] section to your sandbox profile (~/.openclaw/sandbox-profile.toml):
[dashboard]
enabled = true
sync_interval = 1
vault_path = "~/Documents/Vaults/MyVault"
lookback_days = 14
repos = []
script_path = ""
| Field | Default | Description |
|---|---|---|
enabled |
false |
Enable dashboard sync |
sync_interval |
1 |
Sync every Nth heartbeat tick (reserved for future cadence integration) |
vault_path |
"" |
Path to Obsidian vault on host. Falls back to mounts.vault if empty |
lookback_days |
14 |
Only sync issues updated within this many days |
repos |
[] |
Explicit repo list (["owner/repo", ...]). Empty = all repos visible to gh |
script_path |
"" |
Path to sync script. Empty = auto-discover at <vault>/_scripts/gh-obsidian-sync.py |
Vault path fallback
If vault_path is empty, the CLI falls back to mounts.vault from the [mounts] section. Set vault_path explicitly if your host vault is at a different location than the VM mount source (e.g., iCloud path vs local symlink).
Usage¶
CLI Command¶
# Run the sync
bilrost dashboard sync
# Preview without writing files
bilrost dashboard sync --dry-run
The bilrost dashboard command (without sync) still opens the gateway dashboard in your browser, same as before. Use --page to jump to a specific page:
bilrost dashboard # open gateway dashboard
bilrost dashboard --page green # open Green dashboard
bilrost dashboard sync # run GitHub-to-Obsidian sync
MCP Tool¶
The sandbox_dashboard_sync MCP tool lets agents trigger the sync programmatically:
{
"tool": "sandbox_dashboard_sync",
"arguments": {
"dry_run": false
}
}
Returns { "stdout": "...", "stderr": "...", "exit_code": 0 }.
Host-Side Wrapper Script¶
scripts/dashboard-sync.sh is a standalone bash script that reads config from the sandbox profile and runs the sync. It is useful for cron/launchd automation or running outside the CLI:
# Manual run
./scripts/dashboard-sync.sh
# Dry run
./scripts/dashboard-sync.sh --dry-run
Automated Scheduling (launchd)¶
A launchd plist is provided at scripts/com.openclaw.dashboard-sync.plist for periodic sync on macOS. This is a manual host-side step — bootstrap and Ansible do not install host launchd agents.
Installation¶
# Copy the plist to your LaunchAgents directory
cp scripts/com.openclaw.dashboard-sync.plist ~/Library/LaunchAgents/
# Load it (starts immediately and runs every 10 minutes)
launchctl load ~/Library/LaunchAgents/com.openclaw.dashboard-sync.plist
Verify it is running¶
launchctl list | grep com.openclaw.dashboard-sync
Check logs¶
cat /tmp/dashboard-sync.log
Uninstall¶
launchctl unload ~/Library/LaunchAgents/com.openclaw.dashboard-sync.plist
rm ~/Library/LaunchAgents/com.openclaw.dashboard-sync.plist
Full Disk Access required
launchd agents cannot access ~/Documents/ (or ~/Library/Mobile Documents/) without Full Disk Access (FDA). Grant FDA to /bin/bash in System Settings > Privacy & Security > Full Disk Access. Running the script manually from Terminal works without this step because Terminal typically has FDA.
This is the same requirement as the vault-sync and cadence host plists. See Cadence > Host-Side Scheduling for more detail.
Not handled by bootstrap
All host-side launchd plists (vault-sync, cadence, dashboard-sync) are manual installs. Bootstrap provisions the VM via Ansible — it does not modify your macOS LaunchAgents. This is by design: host-side scheduling is a user choice, not a provisioning step.
Troubleshooting¶
"Operation not permitted" in logs¶
The launchd agent is hitting the FDA restriction. Grant Full Disk Access to /bin/bash (see warning above).
"Sync script not found"¶
The sync script is auto-discovered at <vault>/_scripts/gh-obsidian-sync.py. If your script is elsewhere, set script_path explicitly in the [dashboard] section of your profile.
"No vault path configured"¶
Set either dashboard.vault_path or mounts.vault in ~/.openclaw/sandbox-profile.toml.
Sync runs but creates no files¶
- Check that
ghis authenticated:gh auth status - Check
--dayswindow: issues older thanlookback_daysare skipped - Run with
--dry-runto see what would be created without writing