I’ve had a bit of trouble finding a good dream journal program. But I did find a very customizable personal wiki called notebook. link: https://www.wjduquette.com/notebook
It had a built-in log system that allowed you to write one entry per day. I wanted to have one entry per dream so I created my own code by customizing the default code + reading up a little on the language used.
Each log entry get a number and a title upon creation. The number is trailed by a given amount of zeros so that it will stay ordered in the wiki-index. and the log names look like this “Dream 00004 - The dragon of the west” Within the entries there is first a title, then a record date with built in search function that looks like this"Recorded at: 2008-02-23" If you click on “2008” you will find all your dreams that year. “02” shows all dreams that month of that year. “23” shows all the dreams of that day.
Since this is also a wiki, you can add all kinds of pages like techniques, quests and so on. I have a specific page with all the RC’s I know so that I can train them and make them fluent. You can also format your pages with basic html formating like (for mono spaced text) and so on.
This wiki also has a search function, so you can easily find dreams with common themes. Searching for “pirate” will show a list of all the dreams with pirates in them. Only problem with this is that searching for short words like “cat” will show results for “CATch”.
oh, and here’s my codes:
SPOILER - Click to view
#Tcl -- Enter new commands below
proc dreamlog {} {
set pattern {[0-9]* - [a-zA-Z]*}
set plist [lsort -increasing [pages "Dream $pattern"]]
set output "\[%Add entry|addlog%\]\n\n"
foreach name $plist {
append output [string trimright "\n:\[$name\]"]
}
return $output
}
proc addlog {} {
set zeros 4
set current [current]
set pattern {[0-9]* - [a-zA-Z]*}
set plist [lsort -decreasing [pages "Dream $pattern"]]
set date [clock format [clock seconds] -format "%Y-%m-%d"]
set last [lindex $plist 0]
set num [lindex [split $last " "] 1]
set num [forceInteger $num]
set num [expr {int($num)+1}]
set input [askfor "Dream name"]
set zeros [expr {$zeros+1-[string length $num]}]
set stringnum ""
for {set i 0} {$i < $zeros} {incr i} {
append stringnum "0"
}
append stringnum $num
set name "Dream $stringnum - $input"
edit-page $name $name "\[\@dreampage\@\]\nRecorded: $date\n\n "
}
proc dreampage {} {
set current [current]
set pattern {[0-9]* - [a-zA-Z]*}
set plist [lsort -decreasing [pages "Dream $pattern"]]
set last [lindex $plist 0]
set num [lindex [split $last " "] 1]
set dream {dream [0-9]*}
set output ""
append output "\[%Previous|[list goto-previous-page [current] $dream*]%\]"
append output " - \[%Index|goto-page \"Dreamlog\"%\] - "
append output "\[%Next|[list goto-next-page [current] $dream*]%\]"
append output "\n\n"
return $output
}
proc logSearch { searchtext } {
showsearch $searchtext
}
proc forceInteger { x } {
set count [scan $x %d%s n rest]
if { $count <= 0 || ( $count == 2 && ![string is space $rest] ) } {
return -code error "not an integer: \"$x\""
}
return $n
}
proc dreamDate {dreamdate} {
set dreamdate [split $dreamdate "-"]
set year [lindex $dreamdate 0]
set month [lindex $dreamdate 1]
set day [lindex $dreamdate 2]
set yearPattern "Recorded: $year-\[0-9\]*-\[0-9\]*"
set monthPattern "Recorded: $year-$month-\[0-9\]*"
set dayPattern "Recorded: $year-$month-$day"
set output ""
append output "Recorded: "
append output "\[%$year|showsearch \"@dreamDate $year-\"%\]"
append output "-\[%$month|showsearch \"@dreamDate $year-$month-\"%\]"
append output "-\[%$day|showsearch \"@dreamDate $year-$month-$day\"%\]"
return $output
}
You put this in the page called “User code”.
And then you paste this into whatever page you want to have your journal in:
[@dreamlog@]
The rest should be automated, if you have any problems or tips for improvement, please PM me 
And also, if you get an error upon creating your first entry, create a new page called “Dream 00000 - Lah lah!”. You can remove this page later.