Summarizing daily shell activity with Atuin and shell_gpt
obsidian-import is a utility designed to enhance productivity and knowledge management for Obsidian. The tool serves as a bridge between a user’s shell environment and their Obsidian vault, specifically targeting the integration of daily shell command history into Obsidian’s daily notes.
Motivation
If you’re like me, you do a lot of your work via the shell. The script uses Atuin, a shell history management tool, to fetch the history in a structured format. It then employs shell_gpt, to generate a high-level summary of the day’s work, organized by directory or project, and including information about which files were edited.
By integrating obsidian-import into your workflow you can have a high level view of your daily activites in Obsidian. This not only saves time but also ensures that valuable insights and data are not lost in the shuffle of daily tasks.
Example
Here’s an example output summary for my day on 2024-01-31:
> - y-websocket project - Git operations - Added files to staging (
bin/) - Committed changes with message “y.dnup.org is used exclusively for websockets” - Checked git status - Fly.io operations - Listed certificates - Added certificate forydoc.live- Created Sentry extension - DNS and Networking - Useddigto check A record forydoc.liveagainst Cloudflare’s DNS - File and Directory Operations - EditedDockerfile- Editedfly.toml- Movedhomepagedirectory toydoc.live- Development and Deployment - Editedmanifest.jsoninydoc.live- Removednewtab.htmlandstyles.cssfromydoc.live/public- Editedpackage.json,tsconfig.json, andbin/server.jsfor configuration and server setup - Deployed locally usingfly deploy --local-only- Created an aliasdpfor deployment - Installedcross-fetchand attempted to configure it with CommonJS
- Obsidian Plugin Development
- Obsidian Multiplayer Plugin
- Sought AI assistance for JavaScript URL objects and Node.js HTTP requests without libraries like Axios
- Reviewed changes with
git diff- Imported data with
obsidian-import- Built the plugin with
npm run build- RTL_433 Project
- Setup and Installation
- Cloned
rtl_433repository- Installed dependencies including
cmake,libtool,libusb-1.0-0-dev,librtlsdr-dev,rtl-sdr,build-essential,cmake,pkg-config- Attempted to build the project, including using
cmake-gui- Removed and reattempted build setup
- Consulted documentation for building instructions
Functionality
The obsidian-import script operates by extracting the user’s shell history for a given day, filtering out non-material changes (such as navigation or non-impactful git commands), and then summarizing the meaningful activities into a markdown-formatted document. This document is then saved into the user’s Obsidian vault, specifically within a “Logs/Shell” directory, with a filename corresponding to the date of the obsidian-import Project.
Usage
The script is designed to be run at the end of the day or at any time the user wishes to import their shell history into Obsidian. It accepts an optional argument to specify a particular date, defaulting to the current day if no argument is provided.
For example:
# uses `date -d` syntax
obsidian-import '1 day ago'
Adding your log summary to your daily note
You can add your shell history summary to your daily note by adding it to your daily note template like this:
# Shell Activity
Logs/Shell/{{title}}
Adding a role to SGPT
The script uses a special role in order to do summarization. Here’s how you can add the role to sgpt.
mkdir -p ~/.config/shell_gpt/roles/
cat <<EOF > ~/.config/shell_gpt/roles/summarize.json
{
"expecting" : "Answer",
"name" : "summarize",
"role" : "You are shell history summarizer. You understand shell commands, and the implications of their usage.",
"variables" : {}
}
EOF
The script
#!/usr/bin/env bash
# obsidian-import
#
# Import a summary of my daily shell history to Obsidian.
#
export PROMPT="summarize what I worked on today at a very high level in markdown using nested bullet points. For each directory group / project include which files were edited. Ignore commands that don't materially change anything (e.g. navigation, git)."
export AFTER=$(date +"%Y-%m-%dT00:00:00%z")
# Check if at least one argument is provided
if [ $# -gt 0 ]; then
AFTER=$(date -d "$1" +"%Y-%m-%dT00:00:00%z")
fi
echo $AFTER
export BEFORE=$(date -d "$AFTER +1 day" +"%Y-%m-%dT00:00:00%z")
export HISTORY="$(atuin search -f 'time={time} directory={directory} duration={duration} status={exit} command={command}' --after $AFTER --before $BEFORE)"
export HISTORY_BLOCK=$(echo "$HISTORY" | sed 's/^/> /')
export SUMMARY=$(echo -e "$HISTORY" | grep -v 'atuin' | sgpt --role=summarize "$PROMPT")
export DAILY_SHELL=$OBSIDIAN_VAULT/Logs/Shell/$(date -d "$AFTER" "+%Y-%m-%d %a").md
export DOC=$(cat << EOF
# Summary
$SUMMARY
# History
> **> \`\`\`atuin**
$HISTORY_BLOCK
> \`\`\`
EOF
)
echo -e "$DOC" > "$DAILY_SHELL"
echo "Wrote to $DAILY_SHELL"
echo -e "$SUMMARY"