Start here before opening source files.
- Read
docs/codex/PROJECT_CONTEXT.mdfor architecture, data model, and behavior. - Read
docs/codex/FILE_STRUCTURE.mdfor an annotated map of the repository. - Treat
app/signboard.jsas generated output; edit the source modules inapp/**and then run./buildjs.sh. - Tooltip UI is implemented in
app/ui/tooltips.jsand reads existing control labels (title/aria-label/alt) to keep tooltip copy centralized in markup. - App updates are handled in
main.jsviaelectron-updater(GitHub releases), with menu-triggered/manual checks and remind-later state inupdate-preferences.jsonunder ElectronuserData. main.jsalso supports headless MCP mode via--mcp-serverfor local agent integration over stdio; implementation lives inlib/mcpServer.js.- Signboard MCP includes board-name resolution (
signboard_resolve_board_by_name), archive browse/read/restore tools (signboard_list_archive_entries,signboard_read_archive_entry,signboard_restore_archived_card,signboard_restore_archived_list,signboard_archive_list), Trello/Obsidian/Tasks.md import tools, and supports both header-framed + newline-delimited stdio JSON-RPC; dottedsignboard.*names remain accepted as legacy aliases. - Main window stability guards are in
main.js(unresponsivedialog + renderer crash recovery window recreate). main.jssupports--mcp-configto print a ready-to-paste MCP config JSON snippet and exit.Helpmenu includesCopy MCP Config, which copies a ready-to-paste MCP server config snippet to clipboard.preload.jsis now a thin IPC bridge only; board filesystem access, trusted-board validation, and filesystem watch helpers live inmain.js, whileapp/init.jsstill uses the same watch methods to auto-refresh after external board changes.- Archive browsing and restore now run through
lib/archive.jsviamain.js/preload.js; the renderer opens a dedicated Archive modal (app/board/archiveBrowser.js) instead of treating Archive as a board view. - Board view switching (Kanban/Calendar/This Week) is managed in
app/board/boardViews.js; temporal views include cards by card due date and task-level due markers ((due: YYYY-MM-DD)). - Calendar and This Week cards also show a subdued source-list label so users can tell which Kanban list a due item currently belongs to without opening it.
- The header filter popover is owned by
app/board/boardLabels.js; it supports temporaryToday/Overduedate filters plus multi-select label filters, and those filters apply across Kanban, Calendar, and This Week. - The
Overduefilter intentionally ignores completed task-level due markers; overdue card-level due dates still count, and incomplete task due markers still drive overdue matches across Kanban, Calendar, and This Week. - The filter toolbar button is icon-only; when filters are active it gets an accent-tinted active state and exposes the active summary through tooltip/ARIA text rather than visible label text.
- Keyboard shortcut handling is centralized in
app/listeners/window.js; the helper modal is rendered inindex.htmlas#modalKeyboardShortcuts, and native menu accelerators now cover Board Settings (Cmd/Ctrl + ,) plus theme toggling (Cmd/Ctrl + Shift + D). - Shortcut label formatting is shared from
app/board/boardLabels.js, so the keyboard helper modal, board/view menus, and list-action popovers all stay OS-aware and in sync. - New cards created through the desktop app, CLI, MCP, and importers now receive
createdAtplus a compactactivitytrail (created,moved-list,archived,restored); active archive state lives in card frontmatter underarchive, and archived lists persist lightweight sidecar metadata in.signboard-archive.json. - Task checklist parsing + counters + task due-date helpers live in
app/utilities/taskList.jsand feed Board/Calendar/This Week card badges. - Due notification aggregation/formatting (including task-due item snippets) lives in
app/utilities/dueNotifications.jsand is consumed byapp/init.js. - Task-line due-date controls in the editor are positioned from measured textarea line-start coordinates (not raw line index math) to stay aligned with wrapped content.
- In dev/unpackaged builds,
Helpincludes updater preview dialogs so update UI can be tested without publishing a release. - Release assets for updater compatibility are validated by
scripts/verify-release-assets.js(npm run release:verify). - Standard public releases now promote a curated download set: macOS universal, one Windows installer, and Linux
x64/ARM64AppImage+debpackages. Usedocs/release-template.mdfor the GitHub release body. - The in-app updater strips a
## Downloadssection from GitHub release notes before showing the "what's new" dialog, so curated download links can live in release bodies without cluttering update notes. - Task parser coverage tests are in
scripts/test-task-list-parser.js(npm run test:task-list). - Due notification coverage tests are in
scripts/test-due-notifications.js(npm run test:due-notifications). - Dedicated user-facing MCP setup docs are in
MCP_README.md. - Release-facing user and agent docs live in
docs/README.md,docs/using-signboard.md, anddocs/signboard-cli.md. - Reusable agent skill for MCP usage lives at
skills/signboard-mcp/SKILL.md. - Skill UI metadata lives at
skills/signboard-mcp/agents/openai.yaml. - Board tabs/session state live in renderer localStorage:
boardTabs(open tab order) andboardPath(active board root fallback). - Board label definitions are managed in
board-settings.mdfiles inside each board folder (runtime data, not repo source). - Board Settings now includes an
Importpanel that launches explicit Trello/Obsidian/Tasks.md imports into the current board; the renderer wiring lives inapp/board/boardLabels.js, while the actual import filesystem work lives inlib/importers/*throughmain.jsIPC. - External import pickers are tokenized in
main.jsand surfaced throughwindow.chooser.pickImportSources(...); renderer code never reads arbitrary external files directly. - Trello, Obsidian, and Tasks.md importer coverage lives in
scripts/test-import-trello.js,scripts/test-import-obsidian.js, andscripts/test-import-tasksmd.js. - The terminal CLI now exposes a dedicated
archivenamespace (archive cards,archive lists,archive read,archive restore-card,archive restore-list) alongsidesignboard import trello --file ...,signboard import obsidian --source ..., andsignboard import tasksmd --source ...; MCP advertises the matching archive tools plussignboard_import_trello,signboard_import_obsidian, andsignboard_import_tasksmd, while still accepting dottedsignboard.*legacy aliases. - CLI due filtering in
lib/cliBoard.jsnow defaults--due overdueto open task items only, with--task-status anyavailable when callers want completed task due markers included. AGENTS.mdis the cross-tool compatibility entrypoint and should stay aligned with this file.- Skip heavy/generated content unless explicitly needed:
node_modules/,dist/,static/vendor/, and usuallypackage-lock.json. - Always update agent-facing docs when behavior/architecture/tooling changes (
CODEX.md,AGENTS.md,docs/codex/PROJECT_CONTEXT.md,docs/codex/FILE_STRUCTURE.md). - Always update release-facing docs when user behavior, CLI behavior, or setup flows change (
docs/README.md,docs/using-signboard.md,docs/signboard-cli.md,readme.md, andMCP_README.mdwhen relevant).