KaigiBox
Meeting notes and minutes in VS Code. (会議 — kaigi)
One JSON file per meeting with structured metadata and markdown fields. Browse by project / title / subtitle, edit in a custom sectioned editor, search across project and global stores, and link actions to KachiBox tasks.
- Portable — plain JSON on disk; edit in the KaigiBox UI or open as raw JSON
- Project + global — workspace meetings in
.vscode/meetings plus an optional machine-wide folder
- Structured — agenda, notes, decisions, attendees, actions, and custom fields in one file
Install: run from source (see For developers) or install a packaged .vsix when published.



Getting started
- Open a workspace folder in VS Code or Cursor.
- Click the comment icon in the Activity Bar to open KaigiBox → Meetings.
- Click New meeting in the welcome panel or the + button in the view title bar.
- Pick a template (or Blank meeting), choose Project or Global storage if prompted, and enter project / title / subtitle.
- The meeting opens in the KaigiBox Meeting editor. Click Save when you are done.
Meeting JSON files under .vscode/meetings/**/*.json or your global meetings folder open in the KaigiBox editor by default.
The tree mirrors your on-disk folder layout:
{storage root}/
{project}/
{title}/
{subtitle}/ ← optional third level
YYYY-MM-DD-title.json
| Root |
Meaning |
| Workspace (home icon) |
.vscode/meetings in the open workspace |
| Global (globe icon) |
~/.kirokubox/meetings (or kaigibox.meetingsDirectory) |
Toolbar (view title bar):
| Button |
Action |
| + |
New meeting (same as command palette) |
| Search |
Open the main-area search panel |
| Actions roll-up |
List every incomplete action; group, filter, mark done (checklist icon) |
| Refresh |
Reload the tree from disk |
| Today |
Show only meetings dated today (click again to clear) |
| This week |
Show meetings in the current calendar week (Sun–Sat) |
| Open actions |
Tree filter: meetings with at least one incomplete action |
| By project |
Pick a project name; only that project’s meetings remain |
| Show all |
Show every meeting; clears any active filter |
The view title shows the active filter (e.g. Today, Project: Client Acme). KaigiBox: Filter Meetings Tree in the command palette offers the same options in one menu.
Context menu / inline actions:
| Action |
When |
| New Meeting Here |
On a root, folder, or meeting — pre-fills project / title / subtitle from that location |
| Follow-up Meeting |
On a meeting — new meeting today in the same folder; copies agenda, attendees, and open actions; notes and decisions start empty |
| Duplicate Meeting |
On a meeting — new meeting today with a full copy of agenda, notes, decisions, attendees, and all actions |
| Drag and drop |
Drag a meeting onto a folder, storage root, or another meeting to move it into that location (multi-select supported); dropping across project ↔ global asks for confirmation |
| Move Meeting to… |
On a meeting — relocate between workspace (project) and global storage (confirmation required) |
| Delete Meeting |
On a meeting — permanently delete the JSON file (confirmation required; closes the editor tab) |
| Copy as Markdown |
On a meeting, folder, or storage root — copy to clipboard (folder/root exports all meetings inside) |
| Save as Markdown |
Same scope as copy — save a .md file via dialog |
| Rename Folder |
On a project, title, or subtitle folder |
| Delete Folder |
On a folder (deletes all meetings inside; confirmation required) |
Follow-up and duplicate also appear in the command palette (KaigiBox: Follow-up Meeting, KaigiBox: Duplicate Meeting). With no tree selection, the command uses the active meeting editor tab or prompts you to pick a source meeting.
Copied meetings get a new id and today’s date. Action rows receive new ids; done flags and KachiBox links are cleared. Attendee Present checkboxes reset for the new session.
Meeting rows show a date label (Today, Yesterday, weekday, or formatted date). Open action items appear as a suffix, e.g. (2). Today’s meetings use a green icon; other dates use yellow.
Below the Meetings tree, the Actions webview shows storage summary and shortcuts:
| Control |
Action |
| Calendar |
Open the month calendar view (same as KaigiBox: Calendar) |
| Save to Git |
Commit and push the whole git worktree for configured meetings roots (shown when the meetings folder is inside a git repo; includes sibling tasks/ / config/ when they share the repo, e.g. ~/.kirokubox) |
| Open folder |
Open the meetings directory in the OS file manager — when both project and global stores are active, opens the global folder (~/.kirokubox/meetings); project meetings remain under .vscode/meetings in the workspace |
The footer shows which storage is active (project, global, or both), total meeting count, and an uncommitted-changes indicator when git sync applies. Use kaigibox.gitSyncTarget (both, project, or global) to choose which meetings folder(s) Save to Git uses to locate git repos; each sync commits the full repository worktree (not only meetings/).
Status bar
When kaigibox.showStatusBar is enabled (default), the status bar shows a compact summary, for example:
2 today · 5 open actions or 3 this week · 2 overdue
Click the item to open the Open actions roll-up panel. Hover for a full breakdown. Overdue open actions use the warning background color. Set kaigibox.showStatusBar to false to hide it.
Open actions roll-up
KaigiBox: Open Actions Roll-up (Ctrl+Shift+A / Cmd+Shift+A) opens a panel listing every incomplete action across project and global stores.
| Feature |
Behavior |
| Group by |
Folder / person icons — Project or Assignee (unassigned actions grouped under Unassigned) |
| Filter |
Narrow by action text, assignee, meeting title, project, or due date |
| Open |
Click a row to open the meeting and jump to the Actions tab (row highlighted) |
| Mark done |
Check one or more actions, then Mark done — saves each affected meeting once |
Overdue actions are highlighted in red; due-today actions use a warning accent. The panel refreshes when meetings change on disk.
Meeting editor
| Control |
Purpose |
| Save |
Writes JSON to disk; shows Save * when there are unsaved edits |
| Save menu (▼) |
Save as template…, Copy as markdown, Save as markdown… |
| Date |
Meeting date (YYYY-MM-DD); calendar icon opens the date picker |
| Project / Title / Subtitle |
Folder metadata; autocomplete suggests names from existing meetings and folders |
| Timestamps |
Created and updated times (hover for full ISO values) |
| Find |
Open in-meeting search (Ctrl+F while the editor is focused) |
| ← Previous / Next → |
Jump to the older or newer meeting in the same series folder (same project / title / subtitle path); hidden when you are the only meeting in that folder |
Changing project, title, or subtitle and saving moves the file to the matching folder. Changing date or title renames the JSON file.
Tabs
| Tab |
Contents |
| Notes |
Primary meeting notes (markdown) |
| Agenda |
Pre-meeting agenda (markdown) |
| Attendees |
Name, email, role, company; Present checkbox; add from saved lists |
| Actions |
Action items with assignee, optional due date, done checkbox, KachiBox link |
| Decisions |
Decisions log (markdown) |
| Custom |
Fields defined in fields.json |
Notes → action links
In Notes (rich or raw), select text and right-click:
| Menu item |
Behavior |
| Add action |
Creates a new action row, replaces the selection with a jump link, and switches to the Actions tab with the row highlighted |
| Link to Action: … |
(When the meeting already has actions) Links the selection to an existing action only — inserts [label](https://gitlab.com/joel.j.maleport/kaigibox/-/blob/HEAD/kaigibox-action:{id}) and stays on Notes |
Click any action link in notes to jump to that action (tab switch and row highlight). Links are stored as [label](https://gitlab.com/joel.j.maleport/kaigibox/-/blob/HEAD/kaigibox-action:{id}) in the markdown source.
Markdown fields (Notes, Agenda, Decisions)
Each markdown tab has Rich and Raw modes:
- Rich — WYSIWYG-style editing with lightweight formatting (headings, lists, bold, links, tables). Format applies markdown structure to the current content.
- Raw — Edit the markdown source directly.
Inline HTML (raw and rich round-trip) — a small, sanitized subset of HTML is supported when you need styling markdown cannot express:
| Tag |
Purpose |
<span style="…"> |
Color, fonts, weight, decoration, background (see allowed properties below) |
<mark> |
Highlight |
<sub> / <sup> |
Subscript / superscript |
<u> |
Underline |
<small> |
Smaller text |
<font color="…" face="…" size="…"> |
Legacy font tag (saved as a styled <span>) |
Allowed style properties on <span>: color, background-color, background, font-family, font-size, font-weight, font-style, text-decoration, text-decoration-line, vertical-align, letter-spacing. <span> may also keep safe class and title values. Scripts, iframes, event handlers, and unsafe CSS (e.g. url()) are stripped.
Example in raw mode:
Decision: <span style="color:#1a7f37; font-weight:600">approved</span> — see <mark>section 4</mark>.
Standard markdown still covers headings, bold/italic, links, images, lists, blockquotes, code blocks, tables, and horizontal rules. Raw <div>, <p>, <br>, and strikethrough tags are not supported; use markdown paragraphs, single newlines for line breaks, and ~~strikethrough~~ where applicable.
Notes formatting toolbar — a horizontal toolbar at the bottom of Notes (visible in Maximize mode too) plus keyboard shortcuts when any markdown field is focused:
| Shortcut |
Action |
Ctrl+B / Cmd+B |
Bold |
Ctrl+I / Cmd+I |
Italic |
Ctrl+` |
Inline code |
Ctrl+K |
Link (prompts for URL) |
Ctrl+Shift+X |
Strikethrough (~~…~~) |
Ctrl+Alt+1 … 3 |
Heading 1–3 |
Ctrl+Shift+8 |
Bullet list |
Ctrl+Shift+7 |
Numbered list |
Tab / Shift+Tab |
Indent / outdent list item or paragraph (Rich and Raw) |
Ctrl+Shift+. |
Blockquote |
Ctrl+Shift+- |
Horizontal rule |
Alt+Shift+H |
Highlight (<mark>) |
Alt+Shift+U |
Underline |
Ctrl+Shift+I |
Insert image  |
Toolbar buttons also cover text color (six swatches — yellow, green, blue, pink, white, black by default — plus + for custom), subscript, superscript, table template, and Tx (clear formatting). Customize swatches with kaigibox.notesFormatColors (array of hex colors).
Edits sync to the backing JSON document as you type (debounced). Use Save to persist to disk.
Undo / redo — While the KaigiBox meeting editor is focused, Ctrl+Z / Ctrl+Shift+Z (Mac: Cmd+Z / Cmd+Shift+Z) undo and redo edits in the webview. Ctrl+Y also redoes on Windows.
Recover unsaved edits — When kaigibox.backupDrafts is on (default), in-progress edits are backed up under ~/.kirokubox/config/drafts while you type. If you close VS Code without saving, reopening that meeting offers Recover unsaved edits or Discard and use saved file. Auto-save (kaigibox.autosaveIntervalSeconds, default 60) writes dirty meetings to disk periodically; set to 0 to disable.
Attendees
- Type a name — autocomplete suggests people from other meetings (↑↓, Enter).
- Check Present for attendees who joined; absent rows are styled muted.
- Add from list… (footer dropdown) appends everyone from a saved roster in
attendee-lists.json — see Attendee lists for where to create that file and the JSON format.
- Email fields show a mailto: link when filled.
Actions and KachiBox

- Add action rows in the Actions tab (optional Due date per action).
- Click Link to KachiBox on an action (requires KachiBox). A new task is created, KachiBox opens with that task’s checklist ready to edit. Default store: global (
kaigibox.linkKachiboxTaskStorage).
- KaigiBox creates a task JSON under
.vscode/tasks/{year}/ with sourceMeetingId, sourceActionId, and sourceMeetingPath. Metadata copied on link:
- Due date → task
dueDate
- Meeting priority custom field (default field id
priority) → task priority
- Labels:
meeting, project, title, subtitle, and assignee:… when set
- Linked / Open in KachiBox jumps to the linked task (including done or archived tasks); in KachiBox use Open meeting on linked tasks to return to the source meeting.
- Done syncs both ways when a linked task is completed or reopened.
- With
kaigibox.syncLinkedActions (default on), action text, assignee, and due date sync when you save the meeting or edit the task in KachiBox.
KachiBox is optional; linking fails gracefully with a message if it is not installed.
Find in meeting
- Ctrl+F (or Find in the header) opens the find bar.
- Aa — match case; Whole words (default on) — token boundaries (e.g.
Pilot does not match Copilot); .* — regular expression (disables whole words).
- ↑ / ↓ cycle matches; status shows match index and a short snippet.
- Highlights use the editor find-match theme color.
Search panel
KaigiBox: Search Meetings opens a full editor-tab search UI.
- Type to search; results update after a short debounce.
- Field dropdown limits search to one area (project, title, notes, actions, etc.) or All fields.
- Preset dropdown: built-in Open actions and Last 30 days, plus entries from
kaigibox.searchPresets in settings.
- Search options: Whole words (default), Aa (match case), .* (regex), Fuzzy (typo-tolerant via Fuse.js; disables the strict toggles).
- Empty query lists all meetings (or those matching the selected preset filter).
- Default mode is whole-word phrase matching; set
kaigibox.searchMode to fuzzy for fuzzy as the initial toggle state.
- Click a result to open that meeting in the KaigiBox editor.
- Result cards show project path, date, Project / Global scope badge, and a match excerpt when applicable.
Go to Meeting
KaigiBox: Go to Meeting (Ctrl+Shift+G / Cmd+Shift+G) opens a quick pick of meetings by title and date. Recently opened meetings appear first.
Calendar view
KaigiBox: Calendar (Ctrl+Shift+C / Cmd+Shift+C) opens a month grid in the main editor area. Week rows run Sunday through Saturday, matching the This week tree filter.
| Feature |
Behavior |
| Month navigation |
Previous / next month; Today jumps to the current date |
| Day cells |
Dots or counts show days that have meetings; today and the selected day are highlighted |
| Day list |
Click a day to list meetings on that date; click a row to open the meeting |
| Search |
Filter meetings from the calendar (field dropdown, whole words, Aa, regex, fuzzy) — matching days highlight on the grid; results list replaces the day list while search is active |
Also available from the sidebar Actions panel Calendar button or the Meetings welcome links.
Commands
| Command |
Description |
| KaigiBox: Show Meetings |
Focus the Meetings sidebar |
| KaigiBox: New Meeting |
Create a meeting (template + location prompts) |
| New Meeting Here |
Create under the selected tree node |
| KaigiBox: Search Meetings |
Open search panel |
| KaigiBox: Calendar |
Month calendar of meetings; search and open by date |
| KaigiBox: Go to Meeting |
Quick pick to open a meeting by title and date |
| KaigiBox: Open Actions Roll-up |
All incomplete actions, grouped; jump to meeting; bulk mark done |
| KaigiBox: Import Markdown Meetings |
Import from a folder (see below) |
| KaigiBox: Save as Template |
Save active meeting JSON as a template |
| KaigiBox: Open Meeting as JSON |
Reopen with the built-in text editor |
| KaigiBox: Open Meeting |
Open by file path or meeting id (API / KachiBox) |
| KaigiBox: Find in Meeting |
Focus find bar in the custom editor |
| KaigiBox: Save Meeting |
Save the active KaigiBox meeting (Ctrl+S / Cmd+S in the custom editor) |
| KaigiBox: Refresh |
Refresh sidebar tree |
| Delete Meeting |
Permanently delete the selected meeting file (tree context menu; confirmation required) |
| Rename Folder / Delete Folder |
Folder operations in the tree |
| KaigiBox: Set Meeting Action Done |
Internal — KachiBox sync for linked actions |
| KaigiBox: Follow-up Meeting |
New session from an existing meeting (open actions, standing agenda) |
| KaigiBox: Duplicate Meeting |
Full copy of an existing meeting as a new file today |
| KaigiBox: Move Meeting to… |
Move a meeting between project and global stores |
| KaigiBox: Filter Today / This Week / Open Actions / By Project |
Sidebar tree filters (toggle off by clicking again or Show All Meetings) |
| KaigiBox: Filter Meetings Tree |
Combined filter quick pick |
| KaigiBox: Show All Meetings |
Clear the active tree filter |
| KaigiBox: Copy as Markdown |
Copy meeting(s) as markdown (tree, editor save menu, or quick pick) |
| KaigiBox: Save as Markdown |
Save meeting(s) to a .md file |
| KaigiBox: Show Log |
Open the KaigiBox output panel (scan warnings, meeting folder paths) |
Keyboard shortcuts
| Shortcut (Windows / Linux) |
Mac |
Command |
Ctrl+Shift+M |
Cmd+Shift+M |
New meeting |
Ctrl+Alt+F |
Cmd+Alt+F |
Search meetings |
Ctrl+Shift+G |
Cmd+Shift+G |
Go to meeting |
Ctrl+Shift+C |
Cmd+Shift+C |
Calendar |
Ctrl+Shift+A |
Cmd+Shift+A |
Open actions roll-up (status bar click opens the same panel) |
Ctrl+Shift+L |
Cmd+Shift+L |
Show log |
Ctrl+S |
Cmd+S |
Save meeting (KaigiBox editor only) |
Ctrl+F |
Cmd+F |
Find in meeting (KaigiBox editor only) |
Ctrl+Alt+F / Cmd+Alt+F opens meeting search (leaves VS Code Find in Files on Ctrl+Shift+F).
Storage and settings
| Setting |
Default |
Description |
kirokubox.homeDirectory |
(empty → ~/.kirokubox) |
Shared global home for KaigiBox and KachiBox (meetings/, config/, tasks/) |
kaigibox.storageLocation |
automatic |
automatic loads both project and global meetings when a workspace is open; project or global use one store |
kaigibox.meetingsDirectory |
(empty → ~/.kirokubox/meetings) |
Global meetings folder; supports ~ |
kaigibox.configDirectory |
(empty → ~/.kirokubox/config) |
Global templates, fields.json, attendee lists |
kaigibox.autoRefresh |
true |
Refresh tree and search when meeting files change on disk |
kaigibox.backupDrafts |
true |
Back up in-progress meeting edits to ~/.kirokubox/config/drafts; Recover unsaved edits on reopen |
kaigibox.autosaveIntervalSeconds |
60 |
Auto-save open meetings every N seconds when dirty (0 = off) |
kaigibox.notesFormatColors |
["#ffe140","#93c83e","#007fff","#ee0c8d","#ffffff","#000000"] |
Notes toolbar text-color swatches (hex); + still opens custom picker |
kaigibox.gitSyncTarget |
both |
Which meetings folder(s) Save to Git uses to find git repos (both, project, or global); each sync commits the whole worktree |
kaigibox.showStatusBar |
true |
Status bar summary (this week / open actions / overdue); click opens open-actions roll-up |
kaigibox.notifyFollowUpDates |
true |
Notifications when follow-up date fields are due or overdue |
kaigibox.followUpDateFieldIds |
["followUpDate"] |
Custom field ids to watch (plus any with notifyWhenDue in fields.json) |
kaigibox.searchMode |
wholeWord |
Default search panel mode: wholeWord or fuzzy |
kaigibox.searchUseIndex |
true |
Cache flattened meeting text by file mtime for faster search |
kaigibox.searchPresets |
[] |
Named presets: { "label", "query?", "field?", "project?" } |
kaigibox.linkKachiboxTaskStorage |
global |
Store for new tasks from Link to KachiBox: global (kachibox.tasksDirectory) or project (.vscode/tasks) |
kaigibox.syncLinkedActions |
true |
Sync linked action text, assignee, and due date with KachiBox tasks |
kaigibox.linkPriorityFieldId |
priority |
Meeting custom field used as KachiBox priority when linking |
On-disk layout
| Scope |
Meetings |
Config |
| Project |
.vscode/meetings/{project}/{title}/{subtitle}/ |
.vscode/kaigibox/ — fields.json, attendee-lists.json, templates/ |
| Global |
~/.kirokubox/meetings/… (same folder shape) |
~/.kirokubox/config/ — same files as project config |
Legacy paths .kaigibox/meetings/**/*.json and .kirokubox/meetings/**/*.json are registered for the custom editor selector. Data in ~/.kaigibox or ~/.kachibox migrates to ~/.kirokubox on first activation.
Move between project and global
When kaigibox.storageLocation is automatic and a workspace is open, Move Meeting to… relocates a meeting JSON between .vscode/meetings and the global folder. KaigiBox asks for confirmation, preserves folder layout (project / title / subtitle), closes the old editor tab, and reopens the meeting at the new path. Requires both stores to be visible in the tree.
You can also drag a meeting onto the other storage root (or a folder under it) in the tree; cross-store drops use the same confirmation. Dragging onto a folder within the same store updates project / title / subtitle and moves the file without a prompt.
Meeting JSON file
{
"id": "b8c9d0e1f2033445",
"project": "Personal",
"title": "1-1",
"subtitle": "Manager check-in",
"date": "2026-05-27",
"createdAt": "2026-05-27T10:00:00.000Z",
"updatedAt": "2026-05-27T10:30:00.000Z",
"agenda": "- Wins\n- Blockers",
"decisions": "- Agreed to …",
"notes": "## Discussion\n\n…",
"attendees": [
{ "name": "Alex", "email": "alex@example.com", "role": "Engineer", "present": true }
],
"actions": [
{ "id": "act-001", "text": "Follow up", "assignee": "Alex", "dueDate": "2026-06-15", "done": false, "kachiboxTaskId": "abc123" }
],
"customFields": { "client": "Acme" },
"templateId": "tmpl-one-on-one"
}
Filename pattern: {date}-{title-slug}.json (adds a short id suffix if the name collides).
Canonical folder names come from the directory path on load; the editor displays human-readable project / title / subtitle values.
Templates
Templates live in:
.vscode/kaigibox/templates/*.json (project)
~/.kirokubox/config/templates/*.json (global)
Create via Save as template… (save menu or command). New meetings can pick any loaded template from the quick pick.
Templates copy agenda, notes, decisions, attendees, actions (new ids, unlinked), and custom fields. Action done flags and KachiBox links are cleared.
Custom fields
Define fields in .vscode/kaigibox/fields.json and/or ~/.kirokubox/config/fields.json (project overrides global for the same id):
[
{ "id": "client", "label": "Client", "type": "text" },
{ "id": "followUpDate", "label": "Follow-up date", "type": "date" },
{ "id": "recordingUrl", "label": "Recording", "type": "url" },
{ "id": "riskScore", "label": "Risk score", "type": "number" },
{
"id": "priority",
"label": "Priority",
"type": "select",
"options": [
{ "value": "low", "label": "Low" },
{ "value": "medium", "label": "Medium" },
{ "value": "high", "label": "High" }
],
"default": "medium"
},
{ "id": "confidential", "label": "Confidential", "type": "boolean" },
{ "id": "priorMeeting", "label": "Prior meeting", "type": "meeting" }
]
| Type |
Editor control |
Stored value |
text |
Text input |
string |
date |
Date picker |
YYYY-MM-DD string |
url |
URL input |
string |
number |
Number input |
number |
select |
Dropdown (options[].value / label) |
string |
boolean |
Checkbox |
true / false |
meeting |
Meeting picker + Open |
linked meeting id |
meeting fields list other meetings (project + global), newest first. Open jumps to the linked meeting. Exports resolve meeting refs to project / title (date).
Follow-up date notifications
When a watched date custom field is due today or overdue, KaigiBox shows a VS Code notification (at most once per day per meeting and field value). Click Open meeting to jump to that meeting’s Custom tab context.
Watched fields:
- ids listed in
kaigibox.followUpDateFieldIds (default: followUpDate)
- any
date field with "notifyWhenDue": true in fields.json
| Setting |
Default |
Description |
kaigibox.notifyFollowUpDates |
true |
Enable or disable follow-up date notifications |
kaigibox.followUpDateFieldIds |
["followUpDate"] |
Extra field ids to watch |
Attendee lists
Saved rosters for the Attendees tab Add from list… dropdown. Add the file manually under your config folder, or use Edit lists… on the Attendees tab to create and open it (same places as fields.json and templates/).
Where to put the file
| Scope |
Full path (defaults) |
| Project (this workspace) |
{workspace}/.vscode/kaigibox/attendee-lists.json |
| Global (all workspaces) |
~/.kirokubox/config/attendee-lists.json |
Override the global config root with kirokubox.homeDirectory or kaigibox.configDirectory if you use a custom layout.
Tips
- Create the
.vscode/kaigibox or ~/.kirokubox/config folder if it does not exist yet.
- In the sidebar Actions panel, Open folder opens your global config directory when both project and global stores are active (otherwise the meetings/tasks folder for the active store).
- KaigiBox: Show Log lists resolved project/global paths at activation — useful on Remote or WSL.
- After you add or edit
attendee-lists.json, the Add from list… dropdown in open meetings updates automatically (or use Edit lists… on the Attendees tab to open the file).
Project vs global
KaigiBox loads both files when kaigibox.storageLocation is automatic and a workspace is open. Lists are merged by id:
- Same
id in project and global → project wins.
- Different
id values → both appear in Add from list….
Use project for team-specific rosters in git; use global for personal lists you reuse across repos.
- Filename:
attendee-lists.json (note the hyphen and plural lists).
- Root: a JSON array of list objects (not a single object).
- Encoding: UTF-8.
Each list object:
| Property |
Required |
Description |
id |
yes |
Stable id (letters, numbers, hyphens). Used internally; not shown in the dropdown. |
name |
yes |
Label shown in Add from list… |
attendees |
yes |
Array of people to append when the list is chosen |
Each person in attendees:
| Property |
Required |
Description |
name |
yes |
Display name |
email |
no |
Shown in the Email column; enables mailto: when filled |
role |
no |
Job title or role for this roster |
company |
no |
Organization |
present |
no |
Ignored when seeding from a list — rows are always added with Present unchecked; check attendees who joined this meeting |
Invalid JSON or a missing file is treated as an empty list (no error in the UI; the dropdown only shows Add from list…).
Example
~/.kirokubox/config/attendee-lists.json (global):
[
{
"id": "team-core",
"name": "Core team",
"attendees": [
{
"name": "Alex Rivera",
"email": "alex.rivera@example.com",
"role": "Tech lead",
"company": "Example Corp"
},
{
"name": "Sam Chen",
"email": "sam.chen@example.com",
"role": "Engineer",
"company": "Example Corp"
}
]
},
{
"id": "acme-stakeholders",
"name": "Acme stakeholders",
"attendees": [
{
"name": "Morgan Blake",
"email": "morgan.blake@acme.example",
"role": "VP Engineering",
"company": "Acme Corp"
}
]
}
]
Project-only example — .vscode/kaigibox/attendee-lists.json in your repo:
[
{
"id": "sprint-review",
"name": "Sprint review panel",
"attendees": [
{ "name": "Jordan Lee", "role": "Product" },
{ "name": "Pat Nguyen", "email": "pat@example.com", "role": "Staff engineer" }
]
}
]
Using a list in a meeting
- Open a meeting → Attendees tab.
- At the bottom, choose a name from Add from list… (not the placeholder row).
- KaigiBox appends one row per person in that list (existing rows are kept).
- Check Present for people who attended; edit or remove rows as needed.
- Save the meeting — attendees are stored in the meeting JSON, not in
attendee-lists.json.
Choosing the same list again adds duplicate rows if those people are already on the sheet — remove extras manually or pick the list once per meeting.
Import markdown meetings
KaigiBox: Import Markdown Meetings reads a folder tree:
{import root}/
{project}/
{subject}/
{title}/
notes.md
notes.md ← subtitle omitted; filename stem becomes subtitle
- Body →
notes
- Optional YAML front matter (
--- … ---): project, title, subject, subtitle, date, agenda, decisions
- Imported meetings are saved under the project or global store you choose
Export markdown
Copy or save meetings as a readable .md file for sharing outside VS Code.
| Source |
Scope |
| Meeting row (context menu) |
That meeting |
| Folder or storage root (context menu) |
All meetings under that path |
| Editor Save menu (▼) |
Current meeting (includes unsaved edits in the form) |
| Command palette |
Active meeting, tree selection, or quick pick (single / multi) |
Exported markdown includes project, date, agenda, notes, attendees, actions (checkboxes), decisions, and custom fields. Multi-meeting exports are separated by --- and tagged with <!-- kaigibox-export v1 -->.
Default filename: {date}-{title}.md for one meeting; {folder}-export-{date}.md for a folder.
Raw JSON editing
- Reopen Editor With → Text Editor on a meeting file, or
- KaigiBox: Open Meeting as JSON
Prefer Save in the KaigiBox editor for normal edits; it keeps the text document buffer and disk in sync. External saves trigger a refresh in the webview.
Troubleshooting
| Issue |
What to try |
| Tree empty |
Confirm workspace folder is open; check kaigibox.storageLocation; create a meeting |
| Save blocked / “file is newer” |
Close and reopen the meeting; use KaigiBox Save, not only Ctrl+S on a stale JSON tab |
| KachiBox link fails |
Install KachiBox; for linkKachiboxTaskStorage project, open a workspace with a writable .vscode/tasks; for global, check kachibox.tasksDirectory |
| Template not in new-meeting list |
Save to project vs global; reload window after adding files manually |
| Search finds nothing |
Try All fields; enable Fuzzy or disable Whole words; shorten or split the query |
| Custom fields missing |
Add fields.json under .vscode/kaigibox or global config; reopen meeting |
| Bad meeting JSON file |
Fix or remove it; KaigiBox skips unreadable files — details in Output → KaigiBox or KaigiBox: Show Log |
| Missing meetings / wrong folder |
KaigiBox: Show Log lists project/global paths at activation; check kaigibox.meetingsDirectory on Remote/WSL |
Output log
View → Output → KaigiBox (or KaigiBox: Show Log) records:
- Meeting directory roots at activation
- Skipped invalid meeting JSON, duplicate meeting ids, unreadable directories
- Invalid template files, save/link errors, and import summaries
For developers
cd KaigiBox
npm install
npm run compile # or: npm run watch
Press F5 to launch an Extension Development Host (preLaunchTask compiles first).
| Script |
Purpose |
npm run compile |
TypeScript → out/ |
npm run watch |
Rebuild on save |
npm run vscode:prepublish |
Production compile before packaging |
Contributor and architecture notes: doc/DEVELOPING.md.
Companion task extension: KachiBox (../Kachibox relative to this repo when checked out side by side).
License
MIT — see repository package.json.