scrivener

Scrivener

Scrivener is a Slack automation app for logging run notes from any channel.

Overview

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.

Requirements

Quick Start

Run 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

How It Works

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

Important Behavior

Configuration

Required Permissions

Current bot scopes in manifest.ts:

Development

# Local development
slack run

# Deploy to production
slack deploy

# View activity logs
slack activity --tail

Troubleshooting

“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.

Notes on Sample Files

The manifest includes sample workflow and datastore entries from the template. They are not used by Scrivener but remain in manifest.ts.

License

See LICENSE for details.