As many of you know, I have been trying to make Aeon + Obsidian happen. And before you quote Mean Girls at me, I am here to say that it has, in fact, happened.
This isn’t the most elegant solution, it takes a bit of coding, and there isn’t a way to sync it back to Aeon… but you should be able to at least view all of your various entries and relationships and stuff you’ve put into Aeon, and even use wikilinks of that data in Obsidian.
This relies on two things- your exported data from Aeon in a .csv file, and using the Dataview plugin in Obsidian.
Dataview is a programming language that can be used to gather data from inside an Obsidian vault. It also allows you to query for data from a csv file. You need the community plugin to use it.
(I would like to point out that it isn’t really getting updates anymore, and the creator is working on a ‘sequel’ project, but that project won’t work the same way, and someone with more knowledge can let you know if it can be switched over to eventually. But for now I am going to keep using Dataview as is).
This isn’t new, and I’ve been trying to use it with Aeon’s exports for a while, but what bugged me is that I wanted wikilinks. The point of using something like Obsidian was to be able to click through and get to my data fast. Scrivener sync is great, but you can’t link from the meta-data, and this had the same issue. The information was there, but it took more work than with Scrivener sync, and if I wasn’t going to get links either way, Scrivener was faster.
With the help/heavy lifting done by great people on the internet, I’ve finagled a way to make this work, giving us links, in a more-or-less painless system.
Note: I am not a coder. I just hyperfocus on something until I get it to work. I know very little about coding in general, and I am sure dataview is a vast well of fun that can be used in a lot of ways that I am not aware of. So if I make any errors, or you see a better way to do it, please reply!
I am also going to assume anyone reading this at least knows a bit about Obsidian, and dataview, and that it’s all downloaded and installed at this point.
Now you need to export your data from Aeon as a CSV file. I go ahead and just check all the boxes because I can filter out what I need with Dataview, and so I only need the one csv file to update and keep track of.
(There is the small problem of Aeon’s csv data not being really ‘complete’ – the data isn’t shown ‘from both sides.’ So if you have John as Annie’s Husband, but didn’t mark Annie as John’s Wife, just used the bidirectional inverse relationship Husband/Wife, the second one won’t export. It’ll just be blank. I’ve heard that Aeon 3.5 will fix that, and hope it’s still the case).
Put your csv file into your Obsidian vault. Whenever you’ve made changes in Aeon and added things in, just export the file and replace the one in the vault, with the same name. That way, all of the queries will still work and you’ll get updates.
Here’s a simple dataview codeblock:
Table WITHOUT ID
label AS "Event",
Summary,
start-date AS "Begins",
end-date AS "Ends"
FROM "NoctuinadTimeline.csv"
WHERE contains(type, "Chapter")
(Picture added to show the need to add ```dataview and ticks at the end to wrap it)
This will give me a table showing everything in my csv file that uses the ‘Type’ Chapter, with the label changed to the word Event as that sounds better and Aeon used label, alongside the summary, and the inputted dates. It will also be in chronological order. I can’t edit the table from Obsidian, but I can use it to look at stuff quickly or check a date that something started in.
(should have made an example csv, but just using my own, hence all the silly redactions)
What if I did want to be able to click through though?
Table WITHOUT ID
"[[" + label + "]]" AS Label,
"[[" + regexreplace(important-to, "\n", "]]<br>[[") + "]]" AS "Important To Pierre",
start-date AS "Begins",
end-date AS "Ends"
FROM "NoctuinadTimeline.csv"
WHERE contains(important-to, "Pierre")
Here’s a slightly different code block. I added brackets to the terms and phrases that would be showing up.
Label is simple, because that is one phrase/term, and you can just replace the word label with “[[” + label + “]]”
The second thing I’m looking at (a relationship called important-to in my file) is a bit more complicated. Because there are several things that could be important to my character (or an event can be important to more than one person), it would only show up as one long link that squishes all of the answers together if I just did what I did with Label. But using that slightly more daunting looking code, it will separate the links, and each one will stand alone.
Small issue in that it catches all the places that ‘Pierre’ is in the ‘Important to’ section. So I get a list of all the actual important to ‘chapters’ and ‘moments’ as well as the Character spot for ‘Pierre’ as that has all of the chapters and moments listed. Thankfully those moments are linked separately, so I can later refine the code to either just show me the character Pierre with the individual moments in its own column (if I just want that info), or show all of the moments in their own row, where the name ‘Pierre’ appears in the column, if I needed their dates for instance.
EDIT: You can refine the queries!
If I add onto
WHERE contains(important-to, "Pierre")
and make it
WHERE contains(important-to, "Pierre")
WHERE contains(Type, "Moment")
it will only show me Moments that are related to Pierre, and not give me the specific character-row of Pierre, where some of the Moments have his name in them in the Important-To section hence both showing up.
Table WITHOUT ID
"[[" + label + "]]" AS "[[Name]]",
"[[" + regexreplace(important-to, "\n", "]]<br>[[") + "]]" AS "Important To Pierre"
FROM "NoctuinadTimeline.csv"
SORT start-date ASC
WHERE contains(important-to, "Pierre")
WHERE contains(Type, "Moment")
(There are several characters in the ‘extended family’ section, and each have their own wikilink.)
Those links will go to an .md file with their exact name. This has a few issues-- if you have a Chapter named John, and a character named John, the link will only point to one. The links don’t care what else there is in the table, they just see [[John]], not that it’s John, but also marked as Chapter in a different place. So you may have to add something like (ch) to the name for the chapter, like I do.
The other problem is that the links all look like they point to something. Even if you do not yet have an .md file for it. If you’re starting from scratch, no problem, just click it and it’ll make a file, and you can sort it later. But if you have a half-done Obsidian vault, where some of your data is there, and not all of it, then how the heck do you know what is what?
More code blocks! You can tweak what you’re looking for even further and get more precise detailing.
"[[" + meta(link(label)) + "]]" AS "Label"
will give you a bunch of data about the label, instead of just the name.
"[[" + meta(link(label)).path + "]]" AS "Label"
will give you just the path of the markdown page. But if you’re like me and have folders in folders in folders, it’s still not great to sort through.
But you can flip it! Going back to the original line:
"[[" + label + "]]" AS "Label"
and adding in
WHERE !contains(meta(link(label)).path, ".md")
at the end.
That will give you all of the ‘labels’ from your CSV that do not have a markdown file associated with its name in your Obsidian drive:
Table WITHOUT ID
"[[" + label + "]]" AS "Label"
FROM "NoctuinadTimeline.csv"
WHERE !contains(meta(link(label)).path, ".md")
As you can see, for mine it was an issue of using certain characters (I had exported my Scrivener files as .md files to move them to Obsidian). Putting in a / for a name would confuse the program and it wouldn’t export right. Same thing with the others. So now I have to go and edit those names, but now I also know what isn’t a file.
So I can keep that particular code block in an area, and after doing more edits in Aeon and exporting the CSV, see if I happened to add something that didn’t have a spot yet.
I hope this helps folk! Please feel free to add ideas, code, or anything else you can think of. Now to go finish converting my files…
EDIT: I’m learning more stuff! Will continue to update with info as I go.
Turns out if you don’t specify a Sort Order in the dataview, the default order will be whatever you set up on Aeon! This is great as it lets you choose Start Date or Manual or By Color in Aeon, and you have the order you want showing up in Obsidian without needing to specify. And you can always change it in Aeon and update the CSV if you need.
I am running into a bit of trouble where there are mixed sort-order-types all queried in the same block (if any of them are manual, they will show as a chunk together and not interspersed, because of the way you manually set them there in Aeon).
For instance I have an item type called Moments which are varying random points, and Chapters, for book chapters specifically. My chapters are set up manually because my book isn’t always in chronological order.
So if I want a view of my Chapters how they relate to all of my random Moments (like Aeon Timeline’s actual timeline), I either have to change chapter order to Start-Date, or I should be able to then use SORT start-date ASC
to force it back into chronological order.
I say ‘should’ because I am using a fantasy calendar that goes above the year 9999, and that seems to be an issue in terms of recognizing it as a date/year. If you are using a normal calendar I think it should be fine.