Anote (Antoine's Notebook)

Because your creative process is not always linear nor explicable


Version Control Systems

A Version Control System is a manual or automatized system to track changes to a set of files over time. The main objective is to be able to (easily) recall past versions [1].
Perhaps the most straight-forward approach to version control is filename based versioning. In it, the user makes copies of the file of interest and changes its name in such a way that the new name contains enough information for the user to identify the version.
For example, if you work on a proposal up to a point where you are happy with the results and submit it for review, it might be a good idea to save a copy of the submitted proposal with a filename like submission_for_first_review.
This system might be get a bit tricky over time as the submit-review cycle grows or branches. For example, if you have three reviewers giving you feedback asynchronously you can either wait for all the reviews to arrive and then apply all the changes or you can start to work on each review as they arrive.
To keep track of the changes you could name your files first_review_1st_reviewer_changes and so on.
The aggregation of the files first_review_1st_reviewer_changes, first_review_2nd_reviewer_changes and first_review_3rd_reviewer_changes would yield the version submission_for_second_review.
Even if you only have self-review a similar process occurs and it is quite possible to end up with meme-like names: final_final_really_final_version.

Automatic version control systems like CVS, Subversion and Git lifts this burden, the key concept is: save a snapshot of this.
You may give a description of the snapshot to explain why you took it, and how or why the object you are tracking changed from its previous version.
You can use these kind of systems locally for your work, I started to use CVS and Subversion in the early 2000's and later Git; If I'm going to create something that will change overtime, then I create a git repository in my local server and clone copies on my work computers.
I feel protected in case of failure and the history of my repositories are somewhat comprehensive.
But my personal relationship with git is one of love-hate.

Git and I

Git has a plethora of features and what I'm going to describe here, namely, Anote, can be fully (and better) simulated under Git, so if you will, Anote can be seen as a trivial renaming of Git concepts and commands.
Arguably Git (and its flavors) is the de facto version control system; it is fast, simple (in ideas), distributed, allows parallel development, and can cope with big code-bases [1].
Git is designed to enhance collaboration between developers. Developers must be able to communicate clearly in natural language, hence the messages that come with changes must be (1) non empty and (2) clear. If the developers in charge of modifying a Git repository are not convinced of the value of the changes, then, said modification is rejected or asked to be changed. This communication loop is evident in what are known as pull-requests. A feature equivalently implemented by the Linux kernel community as development mailing lists.
The natural language explanations of changes also known as commit messages, are a valuable historic documentation resource. Projects like the Linux kernel have strong formatting and guidelines to write such messages.
When I look at a Git repository I can not avoid to have a linear view of the development process, even if the repository has thousands of branches, they all lead to the same place, the main/master branch. No one in sane mind would keep alive work that was and will not be merged into any significant branch. This use of Git combined with strictly formatted and meaningful commit messages tells a story of a finished product, a system evolving steady.

I feel Git is designed as a Depth-first development story telling. You start at some point, say v.0.1 and steadily evolve to v.0.2 and so on to v.10.0 and beyond. Each evolution comes with a Changelog explaining what has changed from the last version to the current version. This is a perfect way to tell a story over time. Reading the Linux kernel commit history is like reading a book.
However, when I engage in creative, non-mechanical endeavors I want to: (1) Keep a log of what I have done (2) Don't have to explain myself every time and (3) Be able to seek inspiration from several previously tried paths.
That is, I want to have a version system that is designed as a Breath-First development story telling.

Anote

Anote is designed to track individual files over time with no clear evolving structure whatsoever.
It is like our paper notebook, it is not meant to be understood by anyone but us, we develop color codes, symbols, alignments and so on.
Anote basic block is the snapshot, that is, the action: record this version.
To recall previous versions Anote uses checkout to: recover this version. In its simplest form, Anote uses positive integers to distinguish between versions. When a snapshot is requested for a file, a diff is taken between the last known version and the current state of the file. The last known version is either the last snapshot taken or a checked out version.
Anote supports the checkout of different versions at the same time, this is called a Light Table to reference the light tables artists use to put together artwork or review films. Upon destruction of a Light Table, a snapshot is taken and each checked out version in the Light Table is associated with the new version. The idea of a Light Table is to make explicit the collaboration required to arrive at the version registered upon the Light Table's destruction.
The following drawings depict these three operations. The arrows show the flow of information.


All these operations can be modeled with edge-labeled graphs. The semantics of a "d" labeled AB arrow ( A d B ) in Anote is: Version B was created from Version A by applying the change "d". In principle the semantics is not different from any version control system, however, it allows the creation of unstructured graphs.
The path A → B → C → D depicts a sequence of modifications much like a linear Git branch evolution.
The graph B ← A → C depicts a couple of branches emerging from A. Anote does not requires branches to be named, if a snapshot is taken of a version that already has a successor, a new "branch" is created to allocate the snapshot.
Conversely, the graph B → A ← C shows that creating A was a collaboration between B and C. There is no notion of conflict or merging, just transformation and gluing.
Not requiring a message for snapshots or names for conceptual branches, free us to name a version or explain it when we require it for our work, not before.

Anote and Git

Anote is designed to work independently of Git. For example, if you require to patch a complicated bug, you may create a new Git branch and track the file with Anote. You may now modify the file back and forth, explore different fixes while keeping track of the changes to later explore how to tidy up your work into an elegant fix. Once you are happy with the results then you are ready to commit to the Git branch and have those changes merged into a testing branch.

Expanding Anote

Internally Anote works on diff files to represent a transformation, but this approach might be inadequate for human-reviewing purposes. Therefore, I envision modular expansion of Anote to accommodate external parsers and report changes at a higher level of abstraction.

Why Antoine's Notebook

In early 2000's I bought a Spanish translation of the 50th anniversary edition of Le petit prince (The little prince) by Antoine de Saint-Exupéry. The edition contains copies of annotated manuscripts that to me were a treasure because Le petit prince is one of my all-time favorite books. This is the main reason for Anote name. But not the only one
During my time in Copenhagen, Denmark, like many I fell in love with Ib Antoni's (the man who drew Denmark) designs.
An exhibit at the Museum of Copenhagen many of Ib's annotated designs and notebooks were shown, again this shows all the work behind the finished canvas.
So Anote can be as well read as: Antoni's Notebook, but since Antoine came first to my life, history takes precedence. Note: I refuse to call it AA's Notebook.

References

[1] Chacon, S. and Straub, B., "Pro Git", Apress, 2nd Ed., 2014. Online version: https://git-scm.com/book/en/v2 (last accessed: March 16, 2025)

Copyright Alfredo Cruz-Carlon, 2025