seed example content so Bases render non-empty on first open
Five files across four note types so every new Obsidian Base has something to display immediately when the vault is opened: - daily/2026-04-19.md — today's journal entry, covering the PKB setup work. Wikilinks to the permanent note, project brief, and reading note below. - notes/pkb-as-lens-substrate.md — the load-bearing design note capturing the PKB-as-substrate / Council-as-lens inversion that drove this whole extension. - projects/mql/brief.md and log.md — active project tracking the companion Markdown-Query-Language CLI (sibling repo). First log entry records the Go-over-Rust decision and v0.1 scope. - reading/audiopen-integration-research.md — marked done; captures the two-clouds distinction (AudioPen's processing cloud unavoidable; Obsidian Sync optional) and names Tailscale Funnel as the chosen webhook-exposure path. - inbox/2026-04-19-1900_test-ingestion.md — hand-authored fleeting note (source: manual, distinguishable from AudioPen drops) so /triage-inbox has something to exercise on before the real voice pipeline is running. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
type: daily-note
|
||||||
|
date: 2026-04-19
|
||||||
|
mood:
|
||||||
|
tags: [setup, pkb]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2026-04-19
|
||||||
|
|
||||||
|
## What's on today
|
||||||
|
|
||||||
|
Extended the Council repo into a personal knowledge base with the Council as a built-in advisory layer. Scaffolded `daily/`, `notes/`, `projects/`, `reading/`, `inbox/`, `reflections/`, `reviews/`, `_templates/`, and `scripts/`. Shipped the full command suite (/ask-*, /reflect, /triage-inbox, /review-week, /review-month). Set up the AudioPen → webhook → inbox pipeline with a stdlib-only Python receiver and the bash normaliser.
|
||||||
|
|
||||||
|
## Mood / state of mind
|
||||||
|
|
||||||
|
The Council now sees my actual work, not just discrete questions.
|
||||||
|
|
||||||
|
## Fleeting thoughts
|
||||||
|
|
||||||
|
- The difference between /council (formal) and /ask-* (casual consult) matters. Keeping /council reserved preserves its weight; if every question became a /council run the tool would dilute.
|
||||||
|
- [[notes/pkb-as-lens-substrate|The PKB-as-substrate reframe]] was the load-bearing design move.
|
||||||
|
|
||||||
|
## Questions for the Council
|
||||||
|
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- [[projects/mql/brief]] — the companion Markdown-Query-Language CLI
|
||||||
|
- [[notes/pkb-as-lens-substrate]]
|
||||||
|
- [[reading/audiopen-integration-research]]
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
type: fleeting
|
||||||
|
source: manual
|
||||||
|
captured: 2026-04-19T19:00:00+02:00
|
||||||
|
slug: test-ingestion
|
||||||
|
---
|
||||||
|
|
||||||
|
# Test: manual inbox entry
|
||||||
|
|
||||||
|
Seeded as a fleeting note so `/triage-inbox` has something to exercise on. Not from AudioPen — the `source: manual` field distinguishes hand-authored drops from voice-captured ones.
|
||||||
|
|
||||||
|
When `/triage-inbox` runs, Koskela should propose either: promote to `daily/2026-04-19.md` as a sidebar about the setup, or delete (since it's purely a test). Either verdict is fine.
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
type: note
|
||||||
|
title: "PKB as substrate; Council as lens"
|
||||||
|
tags: [design, council, pkb]
|
||||||
|
created: 2026-04-19
|
||||||
|
updated: 2026-04-19
|
||||||
|
---
|
||||||
|
|
||||||
|
# PKB as substrate; Council as lens
|
||||||
|
|
||||||
|
The load-bearing design move for the journaling extension was inverting what is central and what is applied. Rather than: "Council is the thing, notes are added alongside," it became: "the personal knowledge base is the substrate holding thinking over time; the Council (and `/ask-*`, `/reflect`, reviews) are lenses applied to that substrate."
|
||||||
|
|
||||||
|
## Supporting
|
||||||
|
|
||||||
|
Consequences of the inversion:
|
||||||
|
|
||||||
|
- **Notes have primacy.** Daily journal, permanent notes, project logs, reading notes, and fleeting captures are where the user's thinking accumulates. The Council's advisory output (`sessions/`, `reflections/`, `reviews/`) is derivative — it depends on the notes existing.
|
||||||
|
- **Multiple lens modalities make sense.** Formal deliberation (`/council`), lightweight single-agent consult (`/ask-<member>`), journal pattern-surfacing (`/reflect`), structured reviews (`/review-week`, `/review-month`) — all are lenses over the same substrate. If the substrate didn't exist, most of these would be hollow.
|
||||||
|
- **Council members need PKB read access.** Previously they read only the session brief + their own memory. Now they can pull context from the user's actual thinking, with the discipline to read selectively.
|
||||||
|
- **`on-the-user.md` becomes richer.** Every lens invocation is an opportunity to notice something non-obvious about the user and record it. Previously these files grew only during `/council` Phase-5 updates; now they can grow from `/ask-*` and `/reflect` too.
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- [[projects/mql/brief|mql CLI]] — structural queries over the substrate (future lens for when grep+read becomes too coarse)
|
||||||
|
- [[sessions/2026-04-19_volt-nl-fit/outcome|first Council session]] — predates the PKB but structurally compatible
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
type: project
|
||||||
|
title: "mql — Markdown Query Language CLI"
|
||||||
|
status: active
|
||||||
|
started: 2026-04-19
|
||||||
|
tags: [tooling, go, pkb]
|
||||||
|
---
|
||||||
|
|
||||||
|
# mql — Markdown Query Language CLI
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
The Council's members currently reach for Grep + Read to find patterns across `daily/`, `notes/`, `projects/`, `reading/`. Grep is stringly-typed; it doesn't understand YAML frontmatter, wikilinks, tags, or Obsidian Bases. As the PKB grows, "find all sessions where winner = X" or "list permanent notes tagged with Y linked to project Z" will be load-bearing queries, and a proper query tool pays off.
|
||||||
|
|
||||||
|
`mql` is a Go CLI that indexes and queries any repo with Markdown + YAML frontmatter + wikilinks + tags + Obsidian Bases, exposing a Dataview-compatible query language from outside Obsidian.
|
||||||
|
|
||||||
|
## Outcome definition
|
||||||
|
|
||||||
|
v0.1 shipped and installed in `~/.local/bin/mql`:
|
||||||
|
- Cold-scan builds a SQLite index under `~/.cache/mql/<vault-hash>.sqlite`.
|
||||||
|
- `mql 'LIST FROM "sessions" WHERE winner = "vaasa"'` returns JSON.
|
||||||
|
- `mql base <name>` executes an Obsidian `.base` file as a query.
|
||||||
|
- Researcher and `/ask-*`-invoked members can shell out to `mql` instead of grep-walking directories.
|
||||||
|
|
||||||
|
## Constraints
|
||||||
|
|
||||||
|
- Go (single static binary across Linux/macOS/Windows).
|
||||||
|
- Pure-Go SQLite (modernc.org/sqlite) — no cgo, no C toolchain at build time.
|
||||||
|
- MIT or Apache-2.0 license (open-source candidate).
|
||||||
|
- Dataview-compatible subset; `GROUP BY`, `FLATTEN`, `TASK`/`CALENDAR`, inline fields in prose, and `dataviewjs` are explicitly out for v0.1.
|
||||||
|
|
||||||
|
## Log
|
||||||
|
|
||||||
|
See [[log]].
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Sibling repo: `~/projects/mql/` (separate from this repo).
|
||||||
|
- Design: `~/projects/mql/docs/structure/initial-plan.md`.
|
||||||
|
- First customer: this vault. `/var/mnt/data/projects/council/` is the v0.1 integration-test fixture.
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
type: project-log
|
||||||
|
title: "mql — log"
|
||||||
|
project: mql
|
||||||
|
tags: [tooling, go, pkb]
|
||||||
|
---
|
||||||
|
|
||||||
|
# mql — project log
|
||||||
|
|
||||||
|
## 2026-04-19 — project started
|
||||||
|
|
||||||
|
- Scaffolded `~/projects/mql/` as a sibling repo (Go module planned; no code yet).
|
||||||
|
- Archived the design plan at `~/projects/mql/docs/structure/initial-plan.md`.
|
||||||
|
- Decided: Go over Rust (single-binary cross-compile story, pure-Go SQLite via `modernc.org/sqlite`, development velocity for the target scope).
|
||||||
|
- Decided: Dataview-compatible query dialect from the start, not a narrower `--where` expression. Grows cleanly over time.
|
||||||
|
- First milestone (v0.1): indexer + `files`, `meta`, `tags`, `schema` commands — no DQL parser yet.
|
||||||
|
- Council PKB (this repo) is the v0.1 fixture corpus.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
type: reading
|
||||||
|
title: "AudioPen integration paths — self-hosted research"
|
||||||
|
author: "various"
|
||||||
|
source: "web (conversation notes during PKB planning, 2026-04-19)"
|
||||||
|
status: done
|
||||||
|
started: 2026-04-19
|
||||||
|
finished: 2026-04-19
|
||||||
|
tags: [audiopen, self-hosting, pkb, tailscale]
|
||||||
|
---
|
||||||
|
|
||||||
|
# AudioPen integration paths — self-hosted research
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
AudioPen ships several output integrations: email, webhooks, direct-to-Obsidian (which routes through Obsidian's sync cloud), clipboard, and a few third-party automation platforms. The "direct to Obsidian" path is the one an earlier investigation surfaced, and it implicitly sends content through Obsidian Sync. For a self-hosted setup, that path is the wrong choice.
|
||||||
|
|
||||||
|
The cleaner architecture routes AudioPen's polished prose into user-controlled infrastructure via either a webhook (to a self-hosted receiver exposed via Tailscale Funnel) or email with IMAP pull on the desktop. Both fully avoid Obsidian's sync cloud.
|
||||||
|
|
||||||
|
The distinction worth holding: AudioPen's *processing* cloud (audio → polished prose) is unavoidable with AudioPen. The *storage/sync* cloud (Obsidian's paid service) is optional. This document is about the second.
|
||||||
|
|
||||||
|
## Highlights
|
||||||
|
|
||||||
|
- **Tailscale Funnel is the right tool for the webhook path.** Outbound-initiated; `*.ts.net` endpoint; no router ports opened; bypasses Authentik (which is gating Gitea's HTTPS in this setup).
|
||||||
|
- **Email+IMAP is the no-open-ports fallback.** Works if running a public-reachable receiver isn't feasible. Fully outbound.
|
||||||
|
- **Raw → normalised is a two-step pipeline.** AudioPen produces bare prose; a small bash wrapper wraps it in frontmatter and moves it from `inbox/raw/` to `inbox/`. Keeps the receiver stupid; all schema decisions live in one shell script.
|
||||||
|
|
||||||
|
## My notes
|
||||||
|
|
||||||
|
- AudioPen's payload shape varies slightly across versions. The receiver accepts multiple possible body keys (`body`, `output`, `summary`, `polished`) to avoid fragility; the raw payload is logged to stderr so you can inspect drift.
|
||||||
|
- If AudioPen's pricing or terms ever change, the documented escape hatch is whisper.cpp + a local polishing LLM + a phone-side Tasker/Shortcut. Out of scope for v1 but noted.
|
||||||
|
|
||||||
|
## Connections
|
||||||
|
|
||||||
|
- [[projects/mql/brief|mql CLI]] — separate but related self-hosted tooling push
|
||||||
|
- [[notes/pkb-as-lens-substrate|PKB as substrate]] — the overall architecture frame
|
||||||
|
- [[daily/2026-04-19|today's daily note]] — where the decision to go webhook-via-Funnel was made
|
||||||
Reference in New Issue
Block a user