Voice-note capture as the primary mobile input channel. AudioPen polishes on their cloud, POSTs to a self-hosted receiver on the desktop (exposed via Tailscale Funnel so no router ports open and nothing behind Authentik). The receiver writes to inbox/raw/; a bash normaliser wraps each drop in frontmatter and moves it to inbox/; /triage-inbox routes them from there. scripts/audiopen-ingest.sh — 80-line bash normaliser. Idempotent; safe to re-run. Extracts title, slugifies, computes capture timestamp from mtime, rewrites with fleeting-note frontmatter. scripts/audiopen-webhook/main.py — stdlib-only Python HTTP server. Zero pip deps; binds to 127.0.0.1 by default. Accepts flexible payload shapes (title/name + body/output/summary/polished/ orig_transcript) so AudioPen version drift is logged rather than silently dropped. scripts/audiopen-webhook/*.example — systemd user-unit templates for the receiver and the path/service pair that fires the ingest wrapper on inbox/raw/ changes. scripts/pyproject.toml + README.md — Python venv convention. Zero deps today; venv location reserved at scripts/.venv/ (gitignored), manifest at scripts/pyproject.toml, bootstrap documented for both plain pip and uv. Optional-dependencies groups let individual tools pull what they need without bloating the whole env. docs/setup/audiopen.md — full setup guide: generating the shared secret, installing the systemd units, pairing with Tailscale Funnel, configuring AudioPen's webhook, and the IMAP-fallback path for setups that can't run a public-reachable receiver. docs/setup/sync.md — companion guide: Gitea SSH remote (works even with Authentik gating HTTPS), obsidian-git plugin configuration, Syncthing desktop↔phone pairing with the critical .stignore patterns, and the three phone-role tiers so the user can pick Tier 1 / 2 / 3 at their own pace. .gitignore gains **/.venv/, **/venv/, **/__pycache__/, and *.pyc so nobody accidentally commits a materialised environment. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 lines
1.0 KiB
Plaintext
35 lines
1.0 KiB
Plaintext
# audiopen-ingest path + service units — example
|
|
#
|
|
# These two units let the ingest wrapper fire automatically whenever
|
|
# inbox/raw/ gains a file. Install:
|
|
#
|
|
# cp audiopen-ingest.path.example ~/.config/systemd/user/audiopen-ingest.path
|
|
# cp audiopen-ingest.service.example ~/.config/systemd/user/audiopen-ingest.service
|
|
# systemctl --user daemon-reload
|
|
# systemctl --user enable --now audiopen-ingest.path
|
|
#
|
|
# (Adjust %h paths or vault location as needed.)
|
|
|
|
# ---- audiopen-ingest.path ----
|
|
[Unit]
|
|
Description=Watch council/inbox/raw for new AudioPen drops
|
|
|
|
[Path]
|
|
PathChanged=/var/mnt/data/projects/council/inbox/raw
|
|
Unit=audiopen-ingest.service
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
|
|
# ---- audiopen-ingest.service ----
|
|
# (Put this in a separate file — audiopen-ingest.service — systemd does not
|
|
# allow two units in one file.)
|
|
#
|
|
# [Unit]
|
|
# Description=Normalise AudioPen drops into council/inbox/
|
|
#
|
|
# [Service]
|
|
# Type=oneshot
|
|
# ExecStart=/var/mnt/data/projects/council/scripts/audiopen-ingest.sh
|
|
# Environment=COUNCIL_REPO=/var/mnt/data/projects/council
|