Scrivener is a Slack automation app for logging run notes from any channel.
Scrivener lets people log a note from the Shortcuts menu. It stores notes in a monthly canvas and keeps an index canvas for navigation. Thread replies can be captured and appended to the original note.
#run-notes channel in your workspaceRun locally:
slack run
When prompted, create the shortcut trigger. Then create the reply trigger:
slack trigger create --trigger-def triggers/reply_trigger.ts
Deploy:
slack deploy
Then create both triggers in the deployed environment:
slack trigger create --trigger-def triggers/scrivener_trigger.ts
slack trigger create --trigger-def triggers/reply_trigger.ts
Workflow flow:
User selects "Scrivener" from Shortcuts
↓
Modal form collects note text and optional files
↓
log_run_note.ts runs
├─→ Posts the anchor message in #run-notes
├─→ Appends the note to the monthly canvas
├─→ Posts a confirmation in the source channel
└─→ Updates the index canvas
Reply flow:
User replies in a thread
↓
reply_trigger.ts fires for configured channels only
↓
capture_reply.ts appends the reply to the original note in the monthly canvas
#run-notes, not in the source channel.America/Los_Angeles in utils/date_utils.tsRUN_NOTES_CHANNEL_ID if your channel ID is different.Current bot scopes in manifest.ts:
commandschat:writechat:write.publicdatastore:readdatastore:writecanvases:readcanvases:writechannels:historyfiles:readfiles:writeusers:read# Local development
slack run
# Deploy to production
slack deploy
# View activity logs
slack activity --tail
“Could not find #run-notes channel”
Create a channel named run-notes and invite the app, then update RUN_NOTES_CHANNEL_ID if the ID does not match.
Replies not captured Add the channel ID to triggers/reply_trigger.ts and recreate the trigger.
Canvas operations failing
Verify the workspace is on a paid plan and the app has canvases:write scope.
The manifest includes sample workflow and datastore entries from the template. They are not used by Scrivener but remain in manifest.ts.
See LICENSE for details.