Development setup
Prerequisites
Clone and install
git clone https://github.com/cybersader/obsidian-daily-notes-ng.gitcd obsidian-daily-notes-ngbun installProject 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 deployBuild commands
| Command | Description |
|---|---|
bun run dev | Watch mode — rebuilds on change, outputs to test vault |
bun run build | Production build — type-check + bundle |
bun test | Run unit tests |
bun test --watch | Run tests in watch mode |
bun run lint | ESLint with obsidian-plugin rules |
bun run e2e | Run E2E tests (wdio-obsidian-service) |
bun run build:test | Build + deploy to test vault |
Development mode
bun run devThis 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:
OBS="/mnt/c/Users/Cybersader/AppData/Local/Obsidian/Obsidian.com"$OBS vault=dnng-test-vault plugin:reload id=daily-notes-ngTech stack
| Tool | Purpose |
|---|---|
| Bun | Package manager, script runner, test runner |
| esbuild | Bundler (CJS format, ES2018 target) |
| TypeScript | Language (strict mode) |
| ESLint 9 | Linting with eslint-plugin-obsidianmd for community plugin compliance |
| wdio-obsidian-service | E2E testing with sandboxed Obsidian instances |
| Astro Starlight | Documentation site |
| chrono-node | Natural language date parsing (only runtime dependency) |
Linting for community plugin submission
The ESLint config enforces Obsidian community plugin guidelines:
bun run lintKey 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.