Offline Microblog: Changelog
---
I first wrote my "microblog" script in 2019, but as I originally had no intention to share it, I didn't keep many old versions of the script. This changelog thus starts with 0.3.9.1, which is the oldest version I had access to when I first published the script on my capsule. Starting with version 0.4.1, the changelog is complete.
2025-12-12: 9.4-1
Change:
- Refactor generating statistics, now runs much faster
2025-12-11: 9.4
Change:
- Use '-f' with all 'mv' statements
- Move timeline configuration options above user data
- Move timeline creation date and version into preformatted block
- Perform all timeline operations in a temporary file
2025-12-09: 9.3-2
Change:
- Small refactor of statistice code
2025-12-06: 9.3-1
Change:
- Standardize here-document delimiter
- Simplify 'awk' binary pattern presence logic
- Exit 'awk' earlier in binary pattern presence statements
Fix:
- Use here-documents instead of piping when variable to be processed risks being too long for 'printf'
2025-10-05: 9.3
Add:
- Include Gemini description of script as comments
- Print missing and orphaned attachments in timeline statistics
Change:
- Standardize format of 'awk' statements
- Simplify _attachList modification
Fix:
- More portable 'awk' implementation of 'grep -q'
- Redirection race condition on _attachList
2025-12-05: 9.2-1
Fix:
- No longer ignore locale setting
2025-12-05: 9.2
Add:
- Fallback to ASCII character ranges if locale is not set
Change:
- Convert all internal character ranges to explicit lists
- Replace useless 'cat' with command group
Fix
- Typo in timeline header
2025-12-04: 9.1-3
Fix:
- Attachments internally numbered by order of addition instead of lexicographical order of check sum
2025-11-22: 9.1-2
Change:
- Use POSIX lexicographical ranges for 'tr'
Remove:
- Remove unnecessary byte length check
2025-11-21: 9.1-1
Change:
- Rename "utility" variable to "dependency" for consistency
Fix:
- Check post ID compression dependencies
- Validate timeline value for post ID compression
2025-11-21: 9.1
Add:
- Re-add option to compress post IDs
- Re-add timeline header variable to compress post IDs by default
Change:
- Replace all 'grep' command with 'awk'
- Only require 'uniq' as a dependency when calculating statistics
Fix:
- Typo in comment
Remove:
- No longer require 'basename' and 'grep' as dependencies
Notes:
- To compress post IDs by default, add the variable "compressPostId=1" to your timeline header.
2025-10-29: 9.0-1
Fix:
- Incorrect creation date regex when calculating statistics
2025-10-29: 9.0
Add:
- Option to delete pending attachments
Change:
- Rename selectPost() to selectCandidate()
- Expand selectCandidate() to select drafts and attachments as well as posts
- Hide menu options that are not applicable on a given run
- Create _attachList on every run
- Get attachment counter from _attachList instead of attachment fle count
Fix:
- Remove attachments that are duplicate of existing timeline attachments at post time instead of at compose time
2025-10-22: 8.1.1
Add:
- Do not calculate statistics if timeline creation date is missing or malformed
- Check if editor command fails and exit if it does
- More comments
Change:
- Assign default avatar colors as positional arguments
Fix:
- Typos in comments
2025-10-14: 8.1
- Expanded twtxt support
Add:
- Specify a custom twtxt file name; default to '_twtxt.sink'
- Add command-line option to override timeline-defined twtxt file name
Change:
- Rename timeline creation option from 't' to 'n'
- Rename all twtxt options back to 't'
- Reword a comment
Fix:
- Correct typos in comments
Remove:
- Remove message to modify script behavior using timeline variables
Notes:
- This update adds a new variable $twtxtFile to the timeline header, which controls the name of the twtxt file written to by the script. If this variable is missing from the header, a warning message will print, and the script will default to using '_twtxt.sink'. The script will continue to work the same was as before without the variable present, but to suppress the warning message, add it to your timeline header.
2025-10-11: 8.0.1-1
Fix:
- Use correct file check when loading draft attachments list
2025-10-09: 8.0.1
Change:
- Standardize capitalization in error and warning messages
- Require that username contain alphanumerics, dashes, periods and underscores only
Fix:
- Do not overwrite twtxt file when cross-posting
2025-10-09: 8.0
- Refactoring for shell best practices
Add:
- Many explanatory comments
- Include braces and quotes for all variables that don't use arithmetic
- Check if a locale is defined
- '-?' command-line option to print help text
- Add delimiter to all case options
- Check if timeline files are symbolic links
- Strip leading and trailing whitespace from timeline header information
- When creating a new timeline, offer to create a new twtxt file with metadata from the timeline
Change:
- Major readability improvements
- Separate all 'case' options onto their own lines
- Expand command groups onto their own lines
- Replace all pseudo-ternary statements with 'if'/'then'/'else' statements
- Replace all 'if'/'then' statements (with no 'else') with conditionals
- Buffer SVG data and write it to default avatar files atomically
- Use POSIX character sets instead of hard-coded whitespace lists
- Use substitution instead of assignment in all parameter expansions
- Change twtxt-related choices from "t" to "w"
- Combine two merge options that perform the same task
- Clarify warning when attachment is a duplicate
- Allow to cross-post to twtxt even if numerical timezones are not supported by 'date'
Fix:
- When deleting a post, do not delete an attachment if it is linked in another post
- No longer assign to $pageList in subshells
Remove:
- Remove all in-line comments
2025-09-29: 7.2
Change:
- Rename short options for pager and statistics
Fix:
- Add missing 'attachments/' prefix to attachment links
2025-09-22: 7.1.0-1
Fix:
- Set default value for output flag
2025-09-13: 7.1
Change:
- Remove superfluous "--no-readback-post" option
- Simplify help text
2025-09-09: 7.0-1
Change:
- Switch to dashed version format for error fixes
Fix:
- Check for .working directory properly
Meta:
- Fix spelling and formatting errors in changelog
2025-09-02: 7.0
Add:
- Option to use pager when reading a list of posts or drafts
- Allow default avatar generation when creating a new timeline
Change:
- Move default avatar generation to its own function
- Use simpler draft enumeration
Remove:
- No longer control after-posting readback as a timeline variable
Notes:
- The 'outputLastPost' timeline variable is no longer used. You can safely remove it from your timeline header.
2025-08-28: 6.3.1
Change:
- Clarify that some statistics will be omitted if the timeline is empty
- Revert change to skip average post counts when timeline is empty
2025-08-28: 6.3
Change:
- Reformat help text slightly
- Replace 'bc' with 'awk' when generating post statistics
- Only print average post counts when timeline is not empty
- Add percentages to statistics about frequency
2025-08-25: 6.2.2
Change:
- Simplify command check statement
2025-08-25: 6.2.1.2
Fix:
- Replace all locale-dependent character sets with explicit lists
2025-08-25: 6.2.1.1
Fix:
- Manually specify blank characters to strip instead of relying on locale
2025-08-17: 6.2.1
Change:
- Clarify -m option that the original timeline file will be modified
2025-07-18: 6.2
Add:
- Give option to delete post if it is too long
Change:
- Move draft deletion to its own function
- Use function argument to set of saveDraft exits the script
2025-07-09: 6.1.9
Change:
- Modify wording on header comments
- Print invoked script name in timeline header and default avatar comments
2025-07-07: 6.1.8
Change:
- Use custom text for default action when selecting a post
2025-07-03: 6.1.7.4
Fix:
- Implement correct check for .working when timeline file doesn't exist
Meta:
- Re-format changelog
2025-07-01: 6.1.7.3
Change:
- Remove BSD license, release into the public domain
2025-06-27: 6.1.7.2
Fix:
- Use correct path to kernel UUID
2025-06-26: 6.1.7.1
Fix:
- Check that _attachList exists before looping over it when posting
2025-06-26: 6.1.7
Change:
- Exit if the specified timeline file doesn't exist but .working does
2025-06-15: 6.1.6.1
Fix:
- Use correct logic when selecting source of randomness
2025-06-12: 6.1.6
Change:
- Use dedicated function for printing a spinner
2025-06-10: 6.1.5
Change:
- Skip adding attachment if it is a duplicate of a pending attachment that is itself a duplicate of an existing attachment
2025-06-10: 6.1.4.3
Fix:
- Check that _attachList exists when saving and loading drafts
2025-06-07: 6.1.4.2
Fix:
- Improve matching logic
2025-06-07: 6.1.4.1
Fix:
- Suppress output of 'expr'
Remove:
- Unneeded redirections
2025-06-07: 6.1.4
Change:
- Reduce number of subshell spawns
2025-06-05: 6.1.3
Remove:
- Extraneous checks for 'env' and 'sh'
- Extraneous comment symbol
2025-06-05: 6.1.2
Change:
- Reduce subshell spawns by using exit status of 'command'
- When generating avatars, skip checking for 'fold' if 'bc' is not found
2025-06-04: 6.1.1
Change:
- Small refactor
Remove:
- Unused post ID compression option
2025-06-04: 6.1
Add:
- Check all external dependencies at runtime
Change:
- Refactor UUID source logic
2025-06-04: 6.0.0.2
Fix:
- Do not delete drafts directory when a draft is loaded
2025-06-04: 6.0.0.1
Fix:
- Create attachment, draft and working directories in timeline file's directory instead of working directory
2025-06-04: 6.0
Add:
- Use attachment list file in working directory
- Store working and draft attachments in their own subdirectories
- Prevent duplicate attachments in a single post
- Deduplicate attachments in storage
Change:
- Major overhaul of internal file layout
- Name attachments by post number, attachment number and CRC value
- Store draft posts in their own subdirectories
- Replace 'head' with 'sed'
- Change wording when an undefined option is passed
- Refactoring
Fix:
- Fix typo in comment
Remove:
- No longer save UUIDs with drafts, only date
- Remove post ID compression option; remove 'base64' as a dependency
- No longer strip double quotes around timeline editor command
Notes:
- This version changes many aspects of internal files. Existing attachments need to be renamed to enable deduplication. Existing drafts are not usable.
2025-06-03: 5.2.6.2
Fix:
- Fix typo in comment
2025-06-03: 5.2.6.1
Change:
- Change a comment
Remove:
- Remove extra indentation
2025-05-22: 5.2.6
Change:
- Switch default too-long action to saving as draft
Remove:
- Remove menu option to ignore post length limit
2025-05-14: 5.2.5.1
Change:
- Refactor editor selection logic and wording
2025-05-14: 5.2.5
Change:
- Remove text after any POSIX whitespace when checking if editor is installed
- Check $VISUAL for editor before checking $EDITOR
2025-05-08: 5.2.4.7
Fix:
- Don't exit from statistics when 'bc' is not installed
2025-05-04: 5.2.4.6
Change:
- Add comments and spacing to demarcate flow better
Fix:
- Strip spaces when using 'od' to generate UUID
- When using 'printf' to format UUID, ensure all hex strings contain 4 characters
2025-05-03: 5.2.4.5
Fix:
- When printing statistics, check if creation date is after current date
2025-05-03: 5.2.4.4
Fix:
- Use correct years+months+days calculation in statistics
2025-05-01: 5.2.4.3
Fix:
- Swap reply statistics
2025-05-01: 5.2.4.2
Change:
- Convert some 'find' statements to 'for/do/done'
2025-05-01: 5.2.4.1
Fix:
- Handle attachment listing when timeline path contains dashes
2025-05-01: 5.2.4
Add:
- Include statistics for attachments and replies
Change:
- Clean up some double quotes
- Simplify command return code check
2025-05-01: 5.2.3.1
Fix:
- Implement correct variable call
2025-05-01: 5.2.3
Add:
- Include error numbers with all error messages
Change:
- Statistics: Always print timeline age and post count
- Statistics: Print averages if bc is installed, skip otherwise
Fix:
- Repair post count check
2025-05-01: 5.2.2
Change:
- Refactor statistics calculation
2025-05-01: 5.2.1.1
Change:
- Send status messages to STDERR
Fix:
- Decrement correct value when calculating statistics
- Fix typo
Remove:
- Remove references to printOptions function
2025-04-30: 5.2.1
Add:
- Print years, months and days since timeline creation to statistics
Change:
- Change statistics parsing message
Fix:
- Fix typo in comments
2025-04-30: 5.2
Add:
- Add post statistics function
- Print progress indicator while merging timelines and generating statistics
Change:
- Small refactor
Remove:
- Remove function to print options
2025-04-26: 5.1.1.1
- Fix typo and use more consistent wording in help text
2025-04-26: 5.1.1
Change:
- Use different exit codes for different error types
- Change help text wording
- Get recent post only if reading it back
2025-04-25: 5.1.0.3
Change:
- Add clarifications to help text
- Simplify timeline header comments
Remove:
- Delete reference to setting editor in script
2025-04-25: 5.1.0.2
Fix:
- Use correct variable call
2025-04-25: 5.1.0.1
Change:
- Refactor and clarify help text
2025-04-25: 5.1
Add:
- Add '-o' option to print current timeline options
Change:
- Print hint instead of full help text when no timeline is specified
2025-04-22: 5.0.4
Change:
- No longer use _format file; write atomically by grouping all printing commands
- Convert binary 'case' construct to 'if/then/else'
- Convert 'find/read' construct to 'for/do/done'
- Remove extraneous command groupings
Remove:
- Don't exclude _body unnecessarily in 'find'
2025-04-22: 5.0.3.1
Change:
- Explicitly create empty _merged file before writing to it
Fix:
- Remove _merged when cleaning up files
2025-04-21: 5.0.3
Change:
- Skip getting basename of timeline file
2025-04-21: 5.0.2.1
Fix:
- Exit when saving a draft
2025-04-21: 5.0.2
Change:
- Simplify substring removal logic
Remove:
- Remove extraneous newlines
2025-04-21: 5.0.1.1
Fix:
- Fix typo
- Add missing 'fi'
Meta:
- Fix many typos in changelog
2025-04-20: 5.0.1
Change:
- Remove extraneous post list generation
- Move most comments to in-line
Remove:
- Remove some comments
2025-04-20: 5.0
Add:
- Add function to merge diverging timelines
Change:
- No longer try to use $RANDOM for UUID
- Bump version number
Fix:
- Add missing quotes
Remove:
- Remove trap for SIGSTOP
2025-04-20: 4.3.1
Add:
- Use function to select post(s)
Change:
- Replace 'grep | sed 1q' constructs with awk
2025-04-17: 4.3.0.2
Fix:
- Remove extraneous space
2025-04-15: 4.3.0.1
Fix:
- Remove some extraneous trailing spaces
- Call correct function when "-h" option is passed
- Use correct postLength check
2025-04-07: 4.3
Change:
- Generation avatars by command-line option only; remove from timeline header
- Rewrite exit message and draft saving as functions
- Expand comments
- Include license in script file
Notes:
- This version no longer reads the generateAvatars option in your timeline header. The option can be deleted.
2025-03-11: 4.2.4.1
Fix:
- Do not exit again on trap
2025-03-10: 4.2.4
Change:
- Rewrite 'while' statement as 'until'
- Remove some subshell invocations
2025-03-10: 4.2.3
Add:
- Save current IFS and set to only newline at start
- Trap most types of termination signal and restore original IFS
Change:
- Change recent post assignment logic
- Replace some while loops with for loops
Remove:
- Remove all other IFS assignments
2025-03-09: 4.2.2.1
Fix:
- Fix typos
- Include last byte of UUID when compressing
2025-03-06: 4.2.2
Change:
- Refactor some 'if/then/else' statements into pseudo-ternary
- Set default post reply number when checking reply
2025-03-02: 4.2.1
Change:
- Small 'if/then' refactor
- Re-use draft count
Remove:
- Remove remaining unneeded braces
2025-03-02: 4.2.0.1
Fix:
- Repair date and draft recalls
2025-03-02: 4.2
Add:
- Add missing -h option
Change:
- Convert variable names from using underscores to camel case
- Replace some 'while' loops with 'until'
- Indent here-document and use '<<-' to strip tabs
- Replace 'true' with ':' (no-op)
- Simplify post length check logic
- Simplify some if/then/else constructs to pseudo-ternary
Fix:
- Clarify in option messages that timeline is not read from STDIN
Remove:
- Remove braces around variables that don't use parameter expansion
Notes:
- This version changes the names of the variables used by the script and does not read variables from existing timelines out-of-the-box. To make the script read the variables in your timeline header, rename them as follows:
editor_command -> editorCommand post_length -> postLength generate_avatars -> generateAvatars compress_post_id -> compressPostId output_last_post -> outputLastPost
2025-02-27: 4.1.4
Change:
- Refactor post ID compression
- Refactor avatar generation
2025-02-26: 4.1.3
Change:
- Prefer /dev/urandom over $RANDOM as a source of randomness
- Explicitly seed 'awk' srand() with date and time
- Explicitly ignore STDIN when creating new timeline
- Prune 'find' statements on path rather than name
Remove:
- Remove 'xxd' as a dependency
2025-02-26: 4.1.2
Add:
- Check for single 0 when reading posts
Change:
- Change verbiage when not selecting any draft
- Refactor post-delete and post-reply selection logic
Fix:
- Use correct variable call
- Fix typo in comment
- Use tabs instead of spaces to indent
2025-02-25: 4.1.1.2
Remove:
- Remove extraneous space
2025-02-25: 4.1.1.1
Fix:
- Use consistent date format when saving drafts
2025-02-25: 4.1.1
Change:
- Remove extraneous check for 'awk'
- Change warning text when using awk for UUID
- Add explicit no-op when not cross-posting to twtxt
- Refactoring
Fix:
- Fix file and option value checks
- Remove extraneous space
- Correct menu text
2025-02-20: 4.1.0.4
Change:
- Refactor option parsing
2025-02-17: 4.1.0.3
Fix:
- Remove hard-coded location copied from test code
2025-02-17: 4.1.0.2
Fix:
- Fix inconsistent 'find' behavior caused by trailing slashes
2025-02-16: 4.1.0.1
Fix:
- Use UTC for post headers even if 'date' supports local timezones
2025-02-16: 4.1
Change:
- If multiple posts are selected to delete or reply to, show previews and prompt to select only one
- Small refactor of draft previews
Fix:
- Fix broken forward reply writing
Remove:
- Remove warning text if no matching post to read is found
2025-02-16: 4.0
Add:
Change:
- Use UTC date/time in post numbers instead of strict ordering
- Small refactor of options
- Slightly modify text after timeline creation
- Use partial matches to select posts to read, delete or reply to
- If deleting or replying to a post, require exactly one post to be selected
- Bump version number
Fix:
- Use correct option check syntax
- Fix post length check logic
Remove:
- No longer exit on any error
- Remove layer of if-then nesting for checking if posts exist
Notes:
- This version changes many aspects of the script's core functionality and is not compatible with existing timelines out-of-the-box. Existing timelines can be converted using the following script (using GNU date and sed).
timelineFile="$1"
timelineLength=$(wc -l < "$timelineFile")
i=1
while [ $i -le $timelineLength ]; do
line="$(sed -n $((i+1))p "$timelineFile")"
if [ $(expr "x${line}" : "x[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}T[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}.*$") -gt 0 ]; then
postNumber="$(sed -n ${i}p "$timelineFile")"
postNumber="${postNumber#"#### "}"
printf "%s\n" "$postNumber"
sed -i "s/${postNumber}/$(date -ud "$line" +"%Y%m%d%H%M%S")/g" "${timelineFile}"
fi
i=$((i+1))
done
Be sure to rename attachment files accordingly.
2025-02-14: 3.5.3.2
Add:
- Add explicit no-op when continuing to compose post
- Add several comments
Change:
- Refactor script variable load/save logic
Fix:
- Validate numerical option contains only ASCII digits
Remove:
- Remove redundant dependency check
2025-02-13: 3.5.3.1
Change:
- Small refactor
2025-02-13: 3.5.3
Change:
- Refactor option parsing
2025-02-13: 3.5.2.1
Fix:
- Use correct option syntax
2025-02-13: 3.5.2
Add:
- Add version option
2025-02-12: 3.5.1
Add:
- Add switch to save command-line options to existing timeline file
Fix:
- Repair variable replacement 'sed' statement
2025-02-12: 3.5.0.1
Fix:
- Improve date format logic
2025-02-12: 3.5
Add:
- Add command-line options
- Override timeline variables at runtime with command arguments
- Use command-line options to set timeline variables during timeline creation
- Include help text
- Use $EDITOR environment variable if no editor is defined
Change:
- Set default values for most variables
- Check dependencies earlier
- When modifying timeline variables, ensure only first occurrence changes
Fix:
- Fix incorrect post length validation logic
Remove:
- Remove unnecessary arithmetic expansions
2025-02-08: 3.4.0.4
Fix:
- Use correct BRE regex test
2025-02-07: 3.4.0.3
Fix:
- Do not treat post length limit of 0 as an error
- Do not treat no specified avatar as an error
2025-02-06: 3.4.0.2
Change:
- Modify header comments to fit in 80 columns
2025-02-05: 3.4.0.1
Fix:
- Fix typo
2025-02-05: 3.4
Change:
- Add comments to header to clarify timeline variables
- Simplify timeline variable loading method
- Default to $EDITOR environment variable if $editor_command is not set in timeline or script file
Notes:
- This update removes support for comments on the same line as any timeline variables. Existing headers will not work out of the box. Remove comments from any line in the header in which a variable is assigned.
2025-02-05: 3.3.3
Change:
- Remove all 'eval' statements except editor invocation
- Simplify variable validation
2025-02-05: 3.3.2
Change:
- Standardize date call for twtxt posts
- Refactoring
Fix:
- Modify script version date
Remove:
- Remove unneeded check
2025-02-05: 3.3.1
Change:
- Save drafts with ISO 8601 dates
2025-02-05: 3.3
Add:
- Re-add second sanity check: user ID is exactly 32 hexadecimal digits
Change:
- Use ISO 8601 dates in posts
- Unset default timeline editor command
- Replace more 'if/then' constructs with 'case/esac'
- Change timeline variable validation
Fix:
- Check attachment list is nonempty before attempting to move attachments
Remove:
- Remove unnecessary quotes
2025-02-04: 3.2
Change:
- Replace menu 'if/else' statements with 'case/esac'
- Indent with tabs instead of spaces to reduce file size
2025-02-04: 3.1.4
Fix:
- Use correct formatting in header
- Include last attachment when loading a draft
2025-01-23: 3.1.3
Fix:
- Repair post readback check logic
2025-01-23: 3.1.2
Change:
- Do not create attachments directory on timeline creation
2025-01-23: 3.1.1
Fix:
- Format date string correctly
2025-01-23: 3.1
Add:
Change:
- Change "add reply" option from r to p to make options unique
- Set default reply option to cancel reply instead of changing reply
Fix:
- Repair draft load and some attachment load logic
- Check that attachments exist before moving them
- Draft is no longer overwritten on load
Remove:
- Remove extraneous redirect
Meta:
- Update changelog for 3.0
2025-01-22: 3.0
Add:
- Add creation date and time to timeline header
- Check that '%z' format option is defined in date
- Do not crosspost to twtxt if '%:z' format option is undefined in date
- Add final exit statement
Change:
- Immediately exit on any errors
- Reduce number of subshell spawns
- Simplify most 'if' statements without 'else' conditions
- Change draft enumeration logic
- Replace 'touch' with empty redirects
- Replace file globs with 'find' statements
- Standardize status strings to only use "Error" when program flow differs from expectation
- Change whitespace calculation logic in body
- Bump version number
Fix:
- Attachment warning states the maximum number of attachments per post is 100
Remove:
- Remove unused second sanity check
2025-01-20: 2.4
Add:
- Ability to read post body from STDIN
- Skip first menu if post body comes from STDIN
- Require menu input from /dev/tty
Change:
- Move ending spaces from menu strings to printf format statements
2025-01-11: 2.3
Add:
- Add line to header stating script version that generated timeline file
- Add ellipsis to listed draft if draft is more than 50 bytes
Change:
- Store version as script variable
- Print all messages to STDERR except menus and readbacks
- Edit post-too-long menu text to be more clear, in case STDERR is suppressed
2025-01-10: 2.2.2
Change:
- Print warning when readback post doesn't exist
2025-01-10: 2.2.1
Change:
- Put braces around all positional arguments
2025-01-10: 2.2
Change:
- Only override script variables with timeline variables if timeline variables are nonempty
- Wrap all variables in braces
- Update copyright year to 2025
2024-11-22: 2.1.3
Change:
- Touch _format before writing to it
Fix:
- Do not attach .nomedia to post
2024-11-22: 2.1.2
Change:
- Ignore .nomedia file and subdirectories in all 'find' statements
2024-11-22: 2.1.1
Add:
- Implement second timeline sanity check
Change:
- Preset all timeline variables to default values
Fix:
- Print replies in correct format
2024-11-21: 2.1
Change:
- Format post in temporary file before adding to timeline
Remove:
- Remove GNU-specific formatting in date string
2024-11-21: 2.0.2
Fix:
- Fix shebang
2024-11-20: 2.0.1
Fix:
- Use correct call to UUID variable
Meta:
- Add missing change to 2.0 changelog
2024-11-20: 2.0
Add:
- Add UUID to each post
- Generate UUID4 in script if necessary
- Save UUID with draft
- Option to write post UUIDs as hex dump or "compressed" base64-encoded binary
Change:
- Change shell invocation
- Update copyright year to 2024
- Move drafts directory out of working directory
- Change default avatars' color palette
- Change simple avatar to use 7x7 grid of 5 colors instead of 6x6 grid of 6 colors
- Replace all 'echo' statements with 'printf'
- Output all warning and error messages to STDERR
- Bump version number
Notes:
- New optional dependencies for base64 UUID: xxd, base64
- Existing drafts are not usable with this update and will need to be deleted or rewritten.
- To use base64-encoded UUIDs, add the option "compress_post_id=1" to your timeline header.
2024-05-23: 1.5.3
Change:
- Refer to no-draft-selected as a warning instead of an error
2023-12-26: 1.5.2
Fix:
- Fix recalculating post length after each edit
Remove:
- Remove extraneous whitespace
2023-12-15: 1.5.1
Change:
- Standardize 'find' command formats
Fix:
- Do not delete drafts when discarding a post
2023-12-15: 1.5
Add:
- Add changing reply number after setting
- Enable discard (unset) reply number
- Can add attachments or reply in any order
Change:
- Strip leading and trailing whitespace from post body
Fix:
- Remove extraneous whitespace when post has attachments and empty body
2023-09-20: 1.4
Add:
- Check for hanging files on start (e.g. when script is killed) and save as draft
2023-08-18: 1.3.4
Fix:
- Reindex replies and attachments correctly when a post is deleted
2023-08-08: 1.3.3
Fix:
- Do not try to load load invalid drafts
2023-07-24: 1.3.2
Fix:
- Repair empty body check logic
2023-07-21: 1.3.1
Add:
- Check if specified text editor is installed and exit if not
Change:
- Modify error text slightly
2023-07-18: 1.3
Add:
- Specify text editor command in timeline header to override script default
2023-07-13: 1.2.2
Change:
- Rename anchor file from ".anchor" to ".nomedia"
2023-07-11: 1.2.1
Fix:
- Fix infinite loops while generating default avatars
2023-06-09: 1.2
Fix:
- Load attachments with draft posts
- Calculate attachment count correctly
- Output tab instead of "\t" when cross-posting to twtxt
2023-05-22: 1.1
Add:
- Set dedicated variable for editor command (empty by default)
Change:
- Require editor to be defined in script file before first use
- Check that bc is installed if generating default avatars, skip if missing
2023-04-13: 1.0
- Full POSIX compliance
Add:
- Check if timeline file in argument is actually a directory
- Sanity-check first line of timeline file
- Generate avatars only when set in timeline variables
- Add comments to emphasize where to change editor
Change:
- Modify copyright to include year of initial creation and current year
- 'grep' for timeline variables instead of hard-coding line numbers
- Generate both unique and simple avatars
- Refactoring
Notes:
- This update changed header formats slightly and is not compatible with existing headers out of the box. To use this version with existing timelines, run the script once in an empty directory to create a new header, then copy the new header over the existing header. No other changes to the timeline file are required.
2022-05-06: 0.7
Change:
- Move working directory from "_working" to ".working"
Notes:
- Existing drafts will not be accessible unless they are manually moved to the new directory. The original directory can be deleted.
2022-04-21: 0.6.5
Add:
- Check existence of attachments directory on each run
2022-02-28: 0.6.4.2
Change:
- Standardize command substitution format
- Modify copyright to include current year
Meta:
- Fix formatting on index page
2022-01-25: 0.6.4.1
Fix:
- Declare counter properly before being used
2022-01-21: 0.6.4
Add:
- Option to generate simpler avatar from ID, default to unique avatar
Change:
- Add line break after avatar in header
2022-01-21: 0.6.3
Change:
- Make user IDs generate unique default avatars
Fix:
- Remove unused redirection in while loop
2022-01-21: 0.6.2
Change:
- Standardize "c" as a proactive confirmation option in all cases
- change twtxt option from "c" to "t" to standardize function of "c"
Fix:
- Add missing space in second menu
2022-01-19: 0.6.1
Add:
- Print ID next to username in first menu
Fix:
- Fix bash not specified in shebang
2022-01-19: 0.6
Add:
- Add user ID (UUID) when creating a new timeline
- Add proper avatar support
- Optionally generate avatar SVG file from user ID
- Offer to cross-post to twtxt at post time
Notes:
- This update changed header formats slightly and is not compatible with existing headers out of the box. To use this version with existing timelines, run the script once in an empty directory to create a new header, then copy the new header over the existing header. No other changes to the timeline file are required.
2022-01-16: 0.5.3
Add:
- twtxt cross-posting support
Meta:
- v0.3.9.3 rediscovered; changelog modified to include it
2022-01-05: 0.5.2.1
Change:
- Allow uppercase and lowercase for all options, not just main menus
2021-12-06: 0.5.2
Change:
- Allow inputting options as uppercase or lowercase
2021-11-19: 0.5.1
Fix:
- Use correct readback search pattern
2021-11-10: 0.5
Change:
- Change grep header search pattern
- Find post to delete based on line number instead of sed pattern
- Anchor forward reply position based on next header
- Bump version number
Fix:
- More robust index updates when a post is deleted
2021-11-09: 0.4.4
Add:
- Post deletion function
Change:
- Default to reading back latest post if any errors occur
- Remove _body if post is empty
- Add two newlines between nonempty post body and first attachment
Fix:
- Repair forward replies
2021-11-03: 0.4.3
Add:
- BSD license
- Include timezones with all dates
Change:
- Change post header count and config load methods
- Store _body and drafts as POSIX-compliant text files
2021-10-25: 0.4.2
Add:
- Check if _working exists on each run and create if not
2021-10-19: 0.4.1
- Complete rewrite
Change:
- Major refactoring: reduce ~800 SLOC to ~200
- Store attachments and _working directories at top level
- Insert newlines between attachments instead of HTML <br> tags
- Change attachment naming scheme
Remove:
- Remove state function completely
- Remove quick-post option
- Remove broken post header repair function
- Remove usage and version functions
- Remove .dat directory
- Remove conf file; get config options from timeline directly
- Remove index file; get post count from timeline directly
2021-09-21: 0.3.9.6
Change:
- Rename "helpme" function to "usage"
- Move .conf file to .dat/conf
2020-12-06: 0.3.9.3
Change:
- Standardize printf statement formats
- Touch post body on every run
Fix:
- Get correct attachment count when loading a draft
2020-11-26: 0.3.9.1
- Base version for changelog
---
[Last updated: 2025-12-12]