Skip to content

Development setup

Prerequisites

  • Bun (package manager and runtime)
  • Obsidian 1.12+ (with CLI support)
  • Git

Clone and install

Terminal window
git clone https://github.com/cybersader/obsidian-daily-notes-ng.git
cd obsidian-daily-notes-ng
bun install

Project structure

obsidian-daily-notes-ng/
├── src/ # Plugin source code
│ ├── main.ts # Plugin entry point
│ ├── constants.ts # Default settings
│ ├── settings/ # Settings tab and types
│ ├── periodic/ # Periodic note creation and navigation
│ ├── calendar/ # Calendar sidebar (ItemView)
│ ├── templates/ # Template engine + Templater bridge
│ ├── navigation/ # Command palette commands
│ ├── rollover/ # Todo rollover logic
│ ├── frontmatter/ # Date tracking in frontmatter
│ ├── nlp/ # Natural language date parsing (chrono-node)
│ ├── identity/ # Multi-user identity system
│ ├── compat/ # Periodic Notes migration
│ └── utils/ # Debug logging, deep merge
├── tests/ # Unit tests (Bun test runner)
├── test/e2e/ # E2E tests (wdio-obsidian-service)
├── dnng-test-vault/ # Embedded test vault
├── docs/ # This documentation (Astro Starlight)
├── .claude/ # Agent instructions and skills
│ ├── CLAUDE.md # Project-specific agent instructions
│ └── skills/obsidian-cli/ # Obsidian CLI skill for testing
└── .github/workflows/ # CI: release + docs deploy

Build commands

CommandDescription
bun run devWatch mode — rebuilds on change, outputs to test vault
bun run buildProduction build — type-check + bundle
bun testRun unit tests
bun test --watchRun tests in watch mode
bun run lintESLint with obsidian-plugin rules
bun run e2eRun E2E tests (wdio-obsidian-service)
bun run build:testBuild + deploy to test vault

Development mode

Terminal window
bun run dev

This watches src/ and outputs to dnng-test-vault/.obsidian/plugins/daily-notes-ng/. Open the test vault in Obsidian and reload the plugin after each change:

Terminal window
OBS="/mnt/c/Users/Cybersader/AppData/Local/Obsidian/Obsidian.com"
$OBS vault=dnng-test-vault plugin:reload id=daily-notes-ng

Tech stack

ToolPurpose
BunPackage manager, script runner, test runner
esbuildBundler (CJS format, ES2018 target)
TypeScriptLanguage (strict mode)
ESLint 9Linting with eslint-plugin-obsidianmd for community plugin compliance
wdio-obsidian-serviceE2E testing with sandboxed Obsidian instances
Astro StarlightDocumentation site
chrono-nodeNatural language date parsing (only runtime dependency)

Linting for community plugin submission

The ESLint config enforces Obsidian community plugin guidelines:

Terminal window
bun run lint

Key rules:

  • Sentence case for all UI text (obsidianmd/ui/sentence-case)
  • No manual HTML headings in settings (obsidianmd/settings-tab/no-manual-html-headings)
  • No plugin name in headings (obsidianmd/settings-tab/no-problematic-settings-headings)
  • Manifest validation (obsidianmd/validate-manifest)

See the Obsidian Plugin Guidelines for full requirements.