Create GemiHub Dashboards (.dashboard files) — a grid of widgets that embed Bases views, folder card/table/kanban views, notes, web pages, and workflow output. Use when the user asks for a dashboard, a home/overview page, or to arrange .base views and data widgets in a grid.
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Create GemiHub Dashboards (.dashboard files) — a grid of widgets that embed Bases views, folder card/table/kanban views, notes, web pages, and workflow output. Use when the user asks for a dashboard, a home/overview page, or to arrange .base views and data widgets in a grid.
GemiHub Dashboard Skill
Create .dashboard files: a grid of widgets rendered on the GemiHub home view. A .dashboard file is YAML. It is normally authored visually (drag/resize/configure in edit mode), but you can also write the YAML directly.
Always output valid YAML when creating or modifying a .dashboard file.
Workflow
Clarify the goal — what should the dashboard show (tasks, notes, links, metrics)?
Create the backing data first — for a base widget, author a .base file (e.g. under Dashboards/Bases/) and note its view names. You do not need to activate a separate skill: the full Base authoring guide is bundled here as references/base.md (plus references/base-functions.md and references/base-views.md).
Create the file — use create_drive_file (or update_drive_file to edit) with a path like Dashboards/<Name>.dashboard. New dashboards always live under Dashboards/.
Lay out widgets — give each widget an lg layout on a 12-column grid.
Validate YAML — valid YAML; every widget has a unique id, a type, and layout.lg.
File Structure
A .dashboard file is YAML (version 1):
version:1grid:cols:12# column count (default 12)rowHeight:80# pixels per grid row (default 80)gap:8# pixels between cells (default 8)widgets:-id:<uuid>type:base|card|table|kanban|file-list|web|workflow|markdownlayout:lg: { x:0, y:0, w:6, h:4 } # required: position on the wide gridsm: { x:0, y:0, w:12, h:4 } # optional: auto-derived (full-width stack) if omittedconfig: { ... } # per-widget-type config (see below)
id must be unique — use a UUID-like string.
layout.lg is the position on the wide (≥768px) grid: x/y are the top-left cell (0-based), w/h are width/height in grid cells.
sm (narrow screens) is auto-derived as a full-width stack if omitted.
Place widgets so they don't overlap; stack vertically by increasing y.
Unknown top-level keys and unknown widget config keys are preserved on save. An unknown widget type renders as a placeholder but is kept losslessly.
Widget Types
base — embed a Bases view (the primary data widget)
Renders a named view of a .base file (table / cards / list). Use this for any list/table/card of notes — author a .base and point a base widget at it.
-id:tasks-1type:baselayout: { lg: { x:0, y:0, w:8, h:6 } }
config:base:Dashboards/Bases/Tasks.base# vault path to the .base fileview:Active# view name; omit/empty = the base's first view
To author the backing .base, follow references/base.md (the full Base authoring guide bundled with this skill). The same .base can be referenced by multiple base widgets (e.g. one per view).
card — card grid over a folder of markdown notes
-id:projects-1type:cardlayout: { lg: { x:0, y:0, w:6, h:5 } }
config:folder:projects# folder to read (empty = root)filter: [] # optional FilterCondition[]sort:"-mtime"# -mtime | mtime | -ctime | ctime | name | -name | <prop> | -<prop>limit:50card:# field → property mappingtitle:file.name# defaults to file.name so cards are never blanksubtitle:statusimage:cover# embed/link, Drive path, file id, URL, or data URIbody:summarybadges: [tags]
cols:3
table — editable table over a folder of markdown notes
Runs a GemiHub workflow headlessly and renders the result. The workflow runs unattended (no interactive nodes).
-id:digest-1type:workflowlayout: { lg: { x:0, y:6, w:6, h:5 } }
config:workflow:workflows/DailyDigest.yaml# vault path to a .yaml/.yml workflowoutputVariable:result# variable holding the outputoutput:markdown# card | table | markdown | html# card: { title: name, body: summary } # when output=card# columns: [name, status] # when output=table# filter: [] sort: "-name" limit: 50 # card/table post-processingrefreshInterval:60# minutes; 0/omit = manual refresh only
Output contract: card/table workflows must produce a JSON array of objects (one per row); markdown/html workflows must produce a string. A row object with a path key becomes clickable.
markdown — embed an existing Drive markdown note
Renders an existing markdown file inline (preview / wysiwyg / code). It references the file by Drive path, matching the Obsidian Gemini Helper dashboard schema.
The base widget is the import mechanism: set config.base to the .base file's vault path and config.view to a view name. Recommended flow:
Author Dashboards/Bases/Tasks.base (defining views such as "Active", "Done"). The full .base authoring reference is bundled with this skill as references/base.md — no separate skill needs to be activated.
Add base widgets referencing Dashboards/Bases/Tasks.base, one per view.