a minimal [matrix] message watcher and link extractor
You can configure HTTP-backed bot commands in bot.json. Example commands included:
/bot joke— uses icanhazdadjoke (returns thejokefield)/bot catfact— uses catfact.ninja (returns thefactfield)/bot summary— fetches daily link summaries from linkstash API
Add or change commands in bot.json and set BOT_CONFIG_PATH in config.json if you place it elsewhere. The bot will prefix responses using BOT_REPLY_LABEL in config.json (defaults to [BOT]\n).
Bot commands are enabled per room via the allowedCommands array in config.json:
"allowedCommands": []— Enable bot with all commands allowed"allowedCommands": ["summary", "joke"]— Enable bot with only specific commands- Omit
allowedCommands— Bot disabled in that room
This allows fine-grained control over which commands are available in each room.
pairs nicely with lava
lava is a web clipping tool that can run as a server or daemon to automatically populate your Obsidian clippings directory with fresh parsed md from URLs.
- Install Go 1.25+ and SQLite.
- Clone the repo.
- Copy
config.jsonand edit with your Matrix credentials. - Run
maketo build and run.
ash.go: Main application logicdb/: Database schema filesdata/: Runtime data (SQLite, exports)internal/: Internal packages (config, db, matrix)
Edit config.json:
MATRIX_HOMESERVER: Your Matrix server URLMATRIX_USER: Your Matrix user IDMATRIX_PASSWORD: PasswordMATRIX_RECOVERY_KEY: For E2EE verificationMATRIX_ROOM_ID: Array of rooms to watch, each with:id: Room IDcomment: Human-readable namehook: Optional webhook URL for link processingkey: Webhook auth keysendUser/sendTopic: Whether to include user/topic in webhooksallowedCommands: Array of allowed bot commands (empty = all, omit = disabled)
BOT_REPLY_LABEL: Bot response prefix (default:[BOT]\n)LINKSTASH_URL: Base URL for linkstash service (used in summary bot)MATRIX_DEVICE_NAME: Device nameDEBUG: Enable debug logging
make: Build and runmake build: Build onlymake clean: Clean build artifacts
Links are exported to data/links.json.