How to create dairy entries in DayOne style

Hi,

now that I moved into DT4 with lots of my stuff and workflows, I am looking into migrating my daily DayOne usage into it as well.

I am struggling to find a convenient way to create new entries though, which I want to figure out before I will look into migrating my DayOne records into DT4, where I saw that nice howto on the forums.

My daily records mostly look like this:

<headline>
<raw, mostly unformatted text>
<image 1>…<image n> AND/OR <video>

The records also usually have tags, a geo location (preferrably taken from the images, not the location I am creating the entry at) and of course the current timestamp.

When I fumbled around with DT4TG I did not find an easy, convenient way to create records in such a way. Most of the time, the app got stuck and I had to force kill it, when I added some images from my phone (15 Pro Max).

What would be the best approach to create records like this?

Harry.

Why keep a “dairy” that mimics DayOne if you already milk DayOne for all it’s worth? You didn’t mention any need to have your diary connected deeply to your data in DEVONthink. And some of the DayOne features will need non-trivial coding to achieve in DTTG.

So, why change. Unless, change-for-change’s-sake is the goal.

3 Likes

I am trying to validate if I can get rid of DayOne to eliminate another cloud based application with a yearly subscription. I don’t need the connection to my other data though, so that’s not my focus.

The local storage with full control over my data is the reason, why I am looking into it.

Depending on your needs it’s probably worth checking Apple’s newer native offering since they basically used DayOne to design their own, and it would eliminate your subscription and bring your content all under your AppleID, which you presumably use already.

However, if you’re still super-keen to set it all up in DTTG with RTF files or something, it could all be achieved with an Apple Shortcut. There have been a couple of chats over the years in here about doing this so it’s worth digging around on the forum (some key terms might be “journal”, “dayone”, “daily log”).

Apple Shortcuts shines for stuff like this with DTTG I find because you can build a long complex shortcut that pulls data from your different apps (if their devs have built good Shortcut integrations) with one click, and create a custom log just based on what you’re interested in.

My setup is different to yours as I’m using markdown and a couple of other steps, but my daily shortcut to set up the file pulls in various data from my other apps including the weather forecast. I have a separate shortcut that I can run to send the title of things I’m reading to it during the day, so I can add a couple of notes. By the time I open the daily file it’s already got the main info I want in it.

1 Like

sounds interesting. would you be willing to share your exact workflow/shortcuts/scripts?

I’m interested in your workflow too :grinning_face:

Myself, @MsLogica and a few others have laid out the Shortcuts to DTTG workflow a couple of times. I’ve posted a sharable version of my start of the day shortcut more than once. It’s worth a search to see how others do it as well. (One md doc per day with list of all events vs. one group per day with one md doc per event)

1 Like

Which editor/format are you using?
I use Apple Pages; no issues adding images

Is DT2Go a must? With the help of the DEVONthink AI integration I let Claude create an Apple script for my research diary. I bet there is a lot to improve, yet it works. The prompt was:

The script should be run outside of DEVONthink using Keyboard Maestro or a similar tool. It should check the Global Inbox to see if a file with the naming convention “YYYY-MM-DD Forschungstagebuch” already exists, where the sortable dates in ISO format (YYYY-MM-DD) must match the current date. If the file already exists in the Inbox or in the “Forschungstagebuch” group in any open database, the file should be opened as a tab and the tab activated. If a window/tab with the file is already open, the script should not open a new window, but rather activate the already open window/tab. If the file does not exist, it should be created using the “Forschungstagebuch” template in the “Data>New from Template>Academia_Writing” submenu with the tags “tp-Journal” and the current year. The file should be opened as a tab and the tab activated.

One has to change the word “Forschungstagebuch” to something more fitting or come up with their own design.

-- Neuer Eintrag ins Forschungstagebuch; neue Datei wenn nicht vorhanden, öffne Datei, wenn vorhanden

tell application id "DNtp"
	activate
	
	-- Build today's ISO date string (YYYY-MM-DD)
	set theDate to current date
	set yearNum to year of theDate
	set monthNum to (month of theDate) as integer
	set dayNum to day of theDate
	set yearStr to yearNum as string
	set monthStr to characters -2 thru -1 of ("0" & monthNum) as string
	set dayStr to characters -2 thru -1 of ("0" & dayNum) as string
	set dateString to yearStr & "-" & monthStr & "-" & dayStr
	set targetName to dateString & " Forschungstagebuch"
	
	set foundRecord to missing value
	
	-- Step 1: Search in Global Inbox root
	set theInbox to inbox
	set inboxChildren to children of root of theInbox
	repeat with rec in inboxChildren
		if name of rec starts with targetName then
			set foundRecord to rec
			exit repeat
		end if
	end repeat
	
	-- Step 2: Search in "Forschungstagebuch" group across all open databases
	if foundRecord is missing value then
		set allDatabases to databases
		repeat with db in allDatabases
			try
				set docGroup to get record at "/Forschungstagebuch" in db
				if docGroup is not missing value then
					set groupChildren to children of docGroup
					repeat with rec in groupChildren
						if name of rec starts with targetName then
							set foundRecord to rec
							exit repeat
						end if
					end repeat
				end if
			end try
			if foundRecord is not missing value then exit repeat
		end repeat
	end if
	
	-- Step 3: Deep search across all open databases
	if foundRecord is missing value then
		set allDatabases to databases
		repeat with db in allDatabases
			try
				set searchResults to search "name:" & targetName in root of db
				if searchResults is not missing value and (count of searchResults) > 0 then
					repeat with rec in searchResults
						if name of rec starts with targetName then
							set foundRecord to rec
							exit repeat
						end if
					end repeat
				end if
			end try
			if foundRecord is not missing value then exit repeat
		end repeat
	end if
	
	if foundRecord is not missing value then
		-- Check if a window/tab with this record is already open
		set alreadyOpen to false
		repeat with tw in think windows
			try
				set currentTab to current tab of tw
				if currentTab is not missing value then
					set tabRecord to content record of currentTab
					if tabRecord is not missing value then
						if uuid of tabRecord is equal to uuid of foundRecord then
							set alreadyOpen to true
							set index of tw to 1
							exit repeat
						end if
					end if
				end if
				-- Check all tabs in the window
				set allTabs to tabs of tw
				repeat with aTab in allTabs
					try
						set tabRec to content record of aTab
						if tabRec is not missing value then
							if uuid of tabRec is equal to uuid of foundRecord then
								set alreadyOpen to true
								set current tab of tw to aTab
								set index of tw to 1
								exit repeat
							end if
						end if
					end try
				end repeat
				if alreadyOpen then exit repeat
			end try
		end repeat
		
		if not alreadyOpen then
			if (count of think windows) > 0 then
				open tab for record foundRecord in think window 1
			else
				open window for record foundRecord
			end if
		end if
		
	else
		-- Record does not exist: create from template
		set templateBasePath to POSIX path of (path to application support from user domain) & "DEVONthink 3/Templates.noindex/"
		
		set templateFound to false
		set templatePath to ""
		
		set possiblePaths to {templateBasePath & "Academia_Writing/Forschungstagebuch.dtTemplate", templateBasePath & "Academia_Writing/Forschungstagebuch.md", templateBasePath & "Academia_Writing/Forschungstagebuch.txt", templateBasePath & "Academia_Writing/Forschungstagebuch.rtf"}
		
		repeat with aPath in possiblePaths
			try
				tell application "System Events"
					if exists file aPath then
						set templatePath to aPath
						set templateFound to true
					end if
				end tell
			end try
			if templateFound then exit repeat
		end repeat
		
		if templateFound then
			set newRecord to import template templatePath to root of theInbox
		else
			-- Fallback: create a Markdown document manually
			set newRecord to create record with {name:targetName, type:markdown, content:"# " & targetName & return & return} in root of theInbox
		end if
		
		if newRecord is not missing value then
			-- Assign tags "tp-Journal" and the current year
			set tags of newRecord to {"tp-Journal", yearStr}
			
			if (count of think windows) > 0 then
				open tab for record newRecord in think window 1
			else
				open window for record newRecord
			end if
		end if
	end if
end tell

Note: I accidentally didn’t specify the file format but Claude ‘anticipated’ that my preferred format is md (which is true) and set the standard format to md but also added possibility for rtf et al. in the end this is not too bad, because it gives me more flexibility if I decide to move the one particular file to rtf (at least this is what I read into the script).

Well, I have the photos on my iPhone and I do not sync them to iCloud. And its also helpful to write the entries close to the “event” I am logging. So I’d say yes, DT2Go is a must.

Oh. I must have overlooked that detail. Well in that case sorry that my suggestion is of no use for you.